Django:从外键模型中获取不同的值

时间:2016-09-16 18:28:41

标签: django orm views

Django新手,所以如果这是超级直接的我道歉。

我试图获得一份不同的名单"名称"来自"活动"的列表中的值给定的" Person"。

模型设置如下

class Activity(models.Model):

Visit = models.ForeignKey(Visit)
Person = models.ForeignKey(Person)
Provider = models.ForeignKey(Provider)
ActivityType = models.ForeignKey(ActivityType)
Time_Spent = models.IntegerField(blank=True, null=True)
Repetitions = models.CharField(max_length=20, blank=True, null=True)
Weight_Resistance = models.CharField(max_length=50, blank=True, null=True)
Notes = models.CharField(max_length=500, blank=True, null=True)


class ActivityType(models.Model):

Name = models.CharField(max_length=100)
Activity_Category = models.CharField(max_length=40, choices=Activity_Category_Choices)
Location_Category = models.CharField(max_length=30, blank=True, null=True, choices=Location_Category_Choices)

我可以列出使用给定人员完成的所有活动

person = Person.objects.get(id=person_id)
activity_list = person.activity_set.all()

我得到了该人的所有活动清单,没问题。

我能解决的是如何生成在person.activity_set.all()中找到的不同/唯一Activity_Types列表。

person.activity_set.values('ActivityType').distinct()

仅返回带有

的字典
{'ActivityType':<activitytype.id>}

我无法理解如何直接访问ActivityType

上的name属性

这在普通的&ol;中很简单。 SQL,所以我知道我缺乏对ORM的研究是罪魁祸首。

感谢。

更新:我有这个工作,但是这样做是正确的(tm)这样做..

distinct_activities = person.activity_set.values('ActivityType').distinct()
uniquelist = []
for x in distinct_activities:
    valuetofind = x['ActivityType']
    activitytype = ActivityType.objects.get(id=valuetofind)
    name = activitytype.Name
    uniquelist.append((valuetofind, name))

然后迭代那个无边无际的人......

这一定是错的......

1 个答案:

答案 0 :(得分:1)

unique_names = ActivityType.objects.filter(
    id__in=Activity.objects.filter(person=your_person).values_list('ActivityType__id', flat=True).distinct().values_list('Name', flat=True).distinct()

这应该可以解决问题。也不会有很多db命中。 从我的手机写下来,所以关心错别字。