Django通过对两个字段

时间:2015-10-12 18:59:35

标签: mysql django django-models

我有一个有2个字段的模型。

class MyModel:
   tcode = Charfield
   created_on = Date field
   #some more fields

现在这个模型可以有多个具有相同tcode的行,每行可以有不同的日期或相同。

e.g。

tcode1, 1/2/2001
tcode2, 1/2/2001
tcode2, 2/2/2001
....etc.

我想过滤此模型的查询,以便tcode和日期字段组合应该是唯一的。我怎样才能获得所有这些对象。

我试图这样做

MyModel.objects.all().order_by('tcode').distinct('tcode', 'created_on')

现在你可能会问,如果在两个字段中有两行具有相同的数据,我想要一行!对我来说无关紧要,任何一行都能正常工作。

2 个答案:

答案 0 :(得分:9)

我不认为有一个单一的查询可以做到这一点,因为数据库没有从重复中挑选随机的机制。但是,如果你只关心这两个领域,你可以这样做:

MyModel.objects.order_by('tcode').values('tcode', 'created_on').distinct()

这不会为您提供完整的MyModel个对象,而是包含tcodecreated_on的所有现有组合的词典列表。

答案 1 :(得分:2)

今天我遇到了同样的问题。在Django admin的get_queryset方法中,我需要在多个字段中进行不同的操作。我这样解决了这个问题:

from django.db.models import TextField
from django.db.models.functions import Concat
Mymodel.objects.filter(...).annotate(distinct_name=Concat('tcode', 'created_on', output_field=TextField())).order_by('distinct_name').distinct('distinct_name')

此决定有助于返回带有记录ID的QuerySet