Django Queryset 获取所有值并首先相关
Posted
技术标签:
【中文标题】Django Queryset 获取所有值并首先相关【英文标题】:Django Queryset get all values and first related 【发布时间】:2020-08-11 12:08:27 【问题描述】:我需要获取包含“客户”字段和关联的第一个电话号码的 json 响应。
# models.py
class Customer(models.Model):
name = models.CharField(max_length=255)
surname = models.CharField(max_length=255,)
...
class CustomerPhone(models.Model):
customer = models.ForeignKey(Customer, related_name = 'phones', on_delete=models.CASCADE)
phone_number = PhoneNumberField()
...
我的客户可以有更多电话号码,但在汇总表中我只想看到第一部电话(带有最小 ID)
当我尝试使用这个查询集时:
Customer.objects.all().values('surname','phones__phone_number')
我得到
<QuerySet ['surname': 'Gates', 'phones__phone_number': '+39123456789', 'surname': 'Gates', 'phones__phone_number': '+3998765431', 'surname': 'Trump', 'phones__phone_number': '+32123456001', 'surname': 'Trump', 'phones__phone_number': '+3298765000']>
对于只有一个电话号码的客户,我只能获得一个结果吗? 我能得到什么
【问题讨论】:
【参考方案1】:您可以使用SubQuery
expresssion [Django-doc]:
from django.db.models import OuterRef, Subquery
Customer.objects.values('surname').annotate(
phone_number=Subquery(
CustomerPhone.objects.filter(
customer_id=OuterRef('pk')
).order_by('pk').values('phone_number')[:1]
)
)
【讨论】:
【参考方案2】:CustomerPhone
和Customer
之间的关系是ForeignKey
,所以Customer
将有一个customer_phone_set
字段。你需要做的是:
customer = Customer.objects.get(surname="example")
first_phone_number = customer.customer_phone_set.first()
【讨论】:
以上是关于Django Queryset 获取所有值并首先相关的主要内容,如果未能解决你的问题,请参考以下文章
从 Django QuerySet 中获取所有相关的多对多对象
Django-queryset 每个字段获取一个对象=foo
Django开发之路 二(django的models表查询)