2017-01-12 4 views
0

Рассмотрим следующие модели:Django присоединиться запросы из нескольких моделей

class Employee(models.Model): 
    first_name = models.CharField(max_length=128) 
    last_name = models.CharField(max_length=128) 

class MonthName(models.Model): 
    name = models.CharField(max_length=128) 

class Month(models.Model): 
    name = models.ForeignKey(MonthName) 
    year = models.IntegerField() 

class Group(models.Model): 
    name = models.CharField(max_length=128) 

class EmployeeGroup(models.Model): 
    employee = models.ForeignKey(Employee) 
    month = models.ForeignKey(Month) 
    group = models.ForeignKey(Group) 

class Status(models.Model): 
    name = models.CharField(max_length=128) 

class EmployeeStatus(models.Model): 
    employee = models.ForeignKey(Employee) 
    month = models.ForeignKey(Month) 
    status = models.ForeignKey(Status) 

Мне нужно, чтобы отобразить некоторые сотрудники с определенным статусом в указанном Месяца. Наряду с их именами мне нужно отображать имена групп, к которым они принадлежат. Я мог бы сделать что-то вроде этого:

statuses = models.EmployeeStatus.objects.filter(month=some_month, status__name="Current") 
groups = models.EmployeeGroup.objects.filter(month=some_month) 

Но присоединиться к этим запросы (предполагая, что некоторые сортировки) я бы итерацию над ними. Могу ли я поступить так иначе?

Похоже, там должно быть модель

class EmployeeData(): 
    employee = models.ForeignKey(Employee) 
    month = models.ForeignKey(Month) 
    group = models.ForeignKey(Group) 
    status = models.ForeignKey(Status) 

Но перепроектирование приложения является последним средством - у нас есть много данных уже.

ответ

0

Я предполагаю, что вы были бы в состоянии собрать всю эту информацию, начиная с месяца модели

statuses = some_month.employeestatus_set.filter(status__name='Current') 
groups = some_month.employeegroup_set.all() 

Я предположил бы, что вы бы тогда быть в состоянии использовать select_related как часть запроса, получающего some_month в первую очередь, для получения статуса »и групп

+0

Извините, но я не могу понять эту часть' select_related'. Не могли бы вы указать мне в правильном направлении, пожалуйста? – MoonWolf

+0

@MoonWolf - ['select_related'] (https://docs.djangoproject.com/en/1.10/ref/models/querysets/#select-related) (см. Также prefetch_related), используемый для остановки django для выполнения дополнительных запросов получать связанные модели – Sayse

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