【问题标题】:Django Queryset get all values and first relatedDjango Queryset 获取所有值并首先相关
【发布时间】:2023-03-24 22:55:01
【问题描述】:

我需要获取包含“客户”字段和关联的第一个电话号码的 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'}]>

对于只有一个电话号码的客户,我只能获得一个结果吗? 我能得到什么

【问题讨论】:

    标签: django django-models django-queryset


    【解决方案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】:

      CustomerPhoneCustomer 之间的关系是ForeignKey,所以Customer 将有一个customer_phone_set 字段。你需要做的是:

       customer = Customer.objects.get(surname="example")
       first_phone_number = customer.customer_phone_set.first()
      

      【讨论】:

        猜你喜欢
        • 2011-06-16
        • 2020-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-11
        • 1970-01-01
        • 1970-01-01
        • 2015-12-08
        相关资源
        最近更新 更多