2016-09-16 63 views
0

Django新手,所以如果这是超级直率,我很抱歉。Django:从外键模型获取不同的值

我试图从“活动” S对于给定的“人”的列表获得独特的“名称”值的列表。

模型设置如下

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() 

做我得到的那个人,没有问题的所有活动的列表中的所有活动的列表。

我无法理清的是如何产生不同的/独特Activity_Types的person.activity_set.all()找到一个列表

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

只返回一个字典

{'ActivityType':<activitytype.id>} 

我无法理清如何直去的name属性上ActivityType

这是纯醇” SQL非常简单,所以我知道我缺乏groking的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)) 

然后遍历该uniquelist ...

这有可能是错误的...

+0

来自django文档 https://docs.djangoproject.com/el/1.10/ref/models/querysets/#distinct –

+0

对不起,应该发布,我已经尝试过。问题在于ActivityType信息无法通过.distinct()来访问...我可以获取id,但不能获取名称。我只是想知道这是否是错误的方法。 – Gradatc

回答

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() 

这应该做的伎俩。也不会有很多数据库命中。 写下来从我的手机,所以照顾错别字。