Django Queryset获取所有值和第一个相关
Django Queryset get all values and first related
我需要得到一个 json 响应,其中包含“客户”字段和关联的第一个 phone 号码。
# 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()
...
我的客户可以有更多 phone 个号码,但总而言之 table 我只想看到第一个 phone(具有最小 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'}]>
只有一个phone号码的客户,我只能得到一个结果?
我能得到什么
您可以使用 SubQuery
expresssion [Django-doc]:
from django.db.models import <b>OuterRef, Subquery</b>
Customer.objects.values('surname').annotate(
phone_number=Subquery(
CustomerPhone.objects.filter(
<b>customer_id=OuterRef('pk')</b>
).order_by('pk').values('phone_number')[:1]
)
)
您 CustomerPhone
和 Customer
之间的关系是 ForeignKey
,因此 Customer
将有一个 customer_phone_set
字段。您需要做的是:
customer = Customer.objects.get(surname="example")
first_phone_number = customer.customer_phone_set.first()
我需要得到一个 json 响应,其中包含“客户”字段和关联的第一个 phone 号码。
# 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()
...
我的客户可以有更多 phone 个号码,但总而言之 table 我只想看到第一个 phone(具有最小 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'}]>
只有一个phone号码的客户,我只能得到一个结果? 我能得到什么
您可以使用 SubQuery
expresssion [Django-doc]:
from django.db.models import <b>OuterRef, Subquery</b>
Customer.objects.values('surname').annotate(
phone_number=Subquery(
CustomerPhone.objects.filter(
<b>customer_id=OuterRef('pk')</b>
).order_by('pk').values('phone_number')[:1]
)
)
您 CustomerPhone
和 Customer
之间的关系是 ForeignKey
,因此 Customer
将有一个 customer_phone_set
字段。您需要做的是:
customer = Customer.objects.get(surname="example")
first_phone_number = customer.customer_phone_set.first()