我有一个有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')
现在你可能会问,如果在两个字段中有两行具有相同的数据,我想要一行!对我来说无关紧要,任何一行都能正常工作。
答案 0 :(得分:9)
我不认为有一个单一的查询可以做到这一点,因为数据库没有从重复中挑选随机的机制。但是,如果你只关心这两个领域,你可以这样做:
MyModel.objects.order_by('tcode').values('tcode', 'created_on').distinct()
这不会为您提供完整的MyModel
个对象,而是包含tcode
和created_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