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

這應該做的伎倆。也不會有很多數據庫命中。 寫下來從我的手機,所以照顧錯別字。