【问题标题】:how to access to ids of selected names in manytomany relationship django如何在多对多关系django中访问选定名称的ID
【发布时间】:2020-05-28 11:46:48
【问题描述】:

如何通过Programmer访问Languages的所有id

class Language(models.Model):
    name = models.CharField(max_length=20)

class Programmer(models.Model):
    name = models.CharField(max_length=30)
    langs = models.ManyToManyField(Language,through='Level')

class Level(models.Model):
    language = models.ForeignKey(Language)
    programmer = models.ForeignKEy(Programmer)
    level = models.CharField(max_length=10)

我试过这种方法,但没有人成功

Programmer 实例中:instance.level_set.language_idinstance.level.all.language_idinstance.level.all.language.id 并且还尝试了这个instance.level_set.language.id 都说程序员没有属性,languagelanguage_id等 感谢您的任何建议

【问题讨论】:

    标签: django django-models many-to-many


    【解决方案1】:

    一些有用的东西:

    • 将所有语言 ID 获取为可迭代对象:
    instance.langs.values_list('id', flat=True)
    # <QuerySet [1, 5]>
    
    • 级别和语言 ID 作为 2 元组列表:
    instance.level_set.values_list('language__id', 'level')
    # <QuerySet [(1, 'advanced'), (5, 'beginner')]>
    

    【讨论】:

    • 谢谢,如果我想从 Level 中按名称进行过滤怎么办? Level.objects.filter(programmer__name='john') 这个不行,有没有类似的?
    • 应该可以,但也许您的问题是区分大小写? Level.objects.filter(programmer__name__iexact='john')
    • 如果没有错误消息,那么根本就没有一个名为 john 的程序员被分配了一种语言。程序员可能存在,但是您应该从 Programmer 表中查询他。在这种情况下,john 应该出现在这个查询中:Programmer.objects.filter(langs__isnull=True)
    【解决方案2】:

    您应该在程序员实例中尝试以下操作

    instance.langs.all()
    

    对于语言实例

    instance.programmer_set.all()
    

    django many to many relationship with extra fields

    --编辑--

    在您的语言模型下定义一个函数

    def __str__(self):
        return self.id
    
    

    【讨论】:

    • 我想获取选择的语言的ID,它都返回名称而不是ID
    • 我想知道为什么这不起作用 nstance.level_set.language_id ,它应该起作用
    • instance.level_set.language_id 当 Level 类具有 Programmer 和 Language 作为外键但它不是多对多关系的一部分时会起作用。当您定义多对多关系时,通过列名访问属性更加直观且易读,Django 实现了这一点。与您的情况一样,instance.langs 给读者一个想法,即它将包含该实例的语言,而 instance.level_set 不是那么直观
    猜你喜欢
    • 2017-05-07
    • 2012-03-22
    • 2017-08-08
    • 2019-02-20
    • 2022-01-09
    • 2019-07-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多