代码之家  ›  专栏  ›  技术社区  ›  Mehran

从Django中的反向关系获取查询集的不同对象

  •  1
  • Mehran  · 技术社区  · 7 年前
    class Customer(models.Model):
        name = models.CharField(max_length=189)
    
    class Message(models.Model):
        message = models.TextField()
        customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name="messages")
        created_at = models.DateTimeField(auto_now_add=True)
    

    我想在这里做的是,我想获得由message.created_at订购的不同客户的查询集。我的数据库是mysql。

    我试过以下方法。

    qs = Customers.objects.all().order_by("-messages__created_at").distinct()
    m = Messages.objects.all().values("customer").distinct().order_by("-created_at")
    m = Messages.objects.all().order_by("-created_at").values("customer").distinct()
    

    最后,我用了一套来完成这个任务,但我想我可能遗漏了一些东西。我当前的解决方案:

    customers = set(Interaction.objects.all().values_list("customer").distinct())
    customer_list = list()
    for c in customers:
        customer_list.append(c[0])
    

    编辑 是否可以根据客户上次的消息时间获取其订购的客户列表,但查询集还将最后一个消息值作为另一个字段包含?

    1 回复  |  直到 7 年前
        1
  •  2
  •   willeM_ Van Onsem    7 年前

    Customer

    from dango.db.models import Max
    
    Customer.objects.annotate(
        last_message=Max('messages__crated_at')
    ).order_by("-last_message")
    

    last_message NULL None nulls_first nulls_last .order_by F

    from dango.db.models import F, Max
    
    Customer.objects.annotate(
        last_message=Max('messages__crated_at')
    ).order_by(F('last_message').desc(nulls_last=True))
    

    .last_message

    from dango.db.models import F, Max
    
    Customer.objects.filter(
        messages__isnull=False,
    ).annotate(
        last_message=Max('messages__crated_at')
    ).order_by('-last_message')