Django通过查询两个字段来区分组

bak*_*kar 6 mysql django django-models

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

class MyModel:
   tcode = Charfield
   created_on = Date field
   #some more fields
Run Code Online (Sandbox Code Playgroud)

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

例如

tcode1, 1/2/2001
tcode2, 1/2/2001
tcode2, 2/2/2001
....etc.
Run Code Online (Sandbox Code Playgroud)

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

我试图这样做

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

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

Sha*_*ang 14

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

MyModel.objects.order_by('tcode').values('tcode', 'created_on').distinct()
Run Code Online (Sandbox Code Playgroud)

这不会给你完整的MyModel对象,但包含的所有现有组合词典列表tcodecreated_on.


小智 9

今天我遇到了同样的问题。在 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')
Run Code Online (Sandbox Code Playgroud)

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