2016-09-16 5 views
0

Django newbie、これは超直筆なら大変申し訳ありません。Django:外来キーモデルから別の値を取得

"Person"の "Activity"のリストから別個の "Name"値のリストを取得しようとしています。

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属性にまっすぐに進む方法を整理することができません

これはプレーンオールのSQLではかなり簡単ですので、ORMをgrokingしていないことは責任があることを知っています。

ありがとうございました。

アップデート:私は一種の、この作業を持っているが、これは、これを行うための正しい方法(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

申し訳ありませんが、私はそれを試みたことがあります。問題は、.distinct()を介してActivityType情報にアクセスできないことです.Iidは取得できますが、名前は取得できません。私はそれが間違った方法であるかどうか疑問に思いました。 – 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() 

これはすべきことです。 dbヒットもあまりないでしょう。 それを私の電話から書き留めるので、誤植を気にしないでください。

関連する問題