2016-09-16 5 views
0

Django новичок, поэтому, если это супер прямо, извиняюсь.Django: Получите отличные значения от модели внешнего ключа

Я пытаюсь получить список различных значений «Имя» из списка «Активность» для данного «Лица». Настройка

Модели ниже

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>} 

Я не могу разобраться, как получить прямой атрибут имени в ActivityType

Это довольно просто в обычном SQL-запросе, так что я знаю, что виноват мой недостаток в ORM.

Спасибо.

Update: У меня это работает, вроде, но это не может быть правильным способом (тм), чтобы сделать это ..

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() ... Я могу получить идентификаторы, но не имя. Я просто подумал, не так ли? – 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. Написав это с моего телефона, так заботитесь о опечатках.

Смежные вопросы