【问题标题】:How to get value of ForeignKey in views.py?如何在views.py中获取ForeignKey的值?
【发布时间】:2021-10-14 17:11:58
【问题描述】:

我在Django中有下面的models.py和views.py(这只是一个例子)。如何在 views.py 中打印 ForeignKey 的值?

models.py

class student(models.Model):
    name = models.CharField(max_length=50)
    desc = models.CharField(max_length=100, blank=True, null=True)
    phone_number = models.ForeignKey(tell,on_delete=models.SET_NULL, null = True,blank=True)

    def __str__(self):
         return self.name

class tell(models.Model):
    phone_number = models.CharField(max_length=20, blank=True, null=True)

    def __str__(self):
         return self.phone_number

views.py

phones =  student.objects.values('phone_number')
phone =   list(phones)
for ob in phone:
   print(ob)

这仅打印id,但我想要外键的值。

【问题讨论】:

    标签: python-3.x django django-models django-views


    【解决方案1】:

    这是使用.values(…) [Django-doc] 的(许多)原​​因之一:它侵蚀了 Django 模型的模型逻辑层。

    您可以使用:

    tell.objects.filter(<strong>student__isnull=False</strong>)

    这将检索至少具有相关Student 的所有tell 对象。

    您还可以在检索students 时使用.select_related(…) [Django-doc] 选择电话号码,从而避免N+1 问题

    students = student.objects.select_related('phone_number'):
    for stud in students:
        print(stud.phone_number)

    如果你真的想使用tell模型的phone_number,你可以使用.values_list(…) [Django-doc],并使用:

    phones = student.objects.values_list('phone_number__phone_number', flat=True)
    for phone in phones:
        print(phone)

    但是这不是 tell 对象,因此在这种情况下更新、刷新记录是不可能的。

    【讨论】:

    • 我使用了 value() 因为我只想要 phone_number 字段。
    • @namjoo.org:在这种情况下,您可以使用.only() (docs.djangoproject.com/en/dev/ref/models/querysets/#only) 来提高性能,但您不应该侵蚀模型层,特别是因为它随后使用标量值 (或字典),因此所有 Django 的元逻辑都不再存在。
    • 我想用学生对象不告诉查询。
    • @namjoo.org:最后两个代码示例查询student 模型,对于第一个我们搭载查询以使用相同查询获取所有相关tell 数据。跨度>
    • @namjoo.org: 对于带有.values_list(...) 的最后一个,我们甚至可以简单地检索相关tell 模型的phone_number,但通常它不是 使用.values(): django-antipatterns.com/antipattern/over-use-of-values.html 的好主意
    猜你喜欢
    • 2017-05-08
    • 2015-11-01
    • 2018-05-21
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    相关资源
    最近更新 更多