2017-01-12 3 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

は、私はあなたが私はあなたが、その後some_monthを取得するクエリの一部としてselect_relatedを使用することができるだろう想像

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

月モデルから開始することで、このすべての情報を収集することができるだろうと仮定します最初に状態 'とグループを取得するには

+0

申し訳ありませんが、私はこの 'select_related'部分を理解できません。正しい方向に私を向けることができますか? – MoonWolf

+0

@MoonWolf - ['select_related'](https://docs.djangoproject.com/ja/1.10/ref/models/querysets/#select-related)(別名prefetch_relatedも参照してください)、追加のクエリを実行する必要はありません関連するモデルを取得する – Sayse