2015-10-22 64 views
1

我需要一些指導。 我在觀看所有的Django視頻並閱讀關於模型和查詢的說明,但我對聯接缺乏一些瞭解。Django使用過濾器連接表的複雜查詢

以下是我的模型系列。我試圖寫一個查詢,返回一個與名爲「指揮官」的職位相關聯的成員名稱,並給出一個單位。總之,我試圖找到一個單位的指揮官。

但是,爲了達到那裏,我需要橋接成員 - > MemberUnit-> ClassPosition-> Position。

這是我有:

class Member(models.Model): 
    id = models.AutoField(primary_key=True) 
    member_id = models.CharField(unique=True, max_length=30) 
    first_name = models.CharField(max_length=30) 
    middle_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 
    email = models.CharField(max_length=50) 
    home_phone = PhoneNumberField(blank=True) 
    cell_number = PhoneNumberField(blank=True) 
    fax_number = PhoneNumberField(blank=True) 
    Cell_phone = models.CharField(max_length=20) 
    date_joined = models.DateField() 
    invite_reason = models.CharField(max_length=64) 
    User = models.ForeignKey(User, blank=True, null=True) 

    def __str__(self):    # __unicode__ on Python 2 
     return self.first_name + " " + self.last_name 

class Position(models.Model): 
    Position_name = models.CharField(max_length=30, unique=True) 
    Position_description = models.CharField(max_length=5000) 
    Max_count = models.IntegerField() 

    def __str__(self): 
     return self.Position_name 

class ClassPosition(models.Model): 
    unit_class = models.ForeignKey(Class) 
    unit_position = models.ForeignKey(Position) 
    Date_effective = models.DateField() 

    def __str__(self): 
     return "Class: " + self.unit_class.class_name + "; Position: " + self.unit_position.Position_name 

class MemberUnit(models.Model): 
    Member = models.ForeignKey(Member) 
    Unit = models.ForeignKey(Unit) 
    Position = models.ForeignKey(ClassPosition) 

    def __str__(self): 
     return self.Unit.Unit_name + " " + self.Position.unit_position.Position_name + " (" + self.Member.first_name + " " + self.Member.last_name + ")" 

class Unit (models.Model): 
    HType = (
     ('HQ', 'IFT Headquarters'), 
     ('JTF', 'Joint Task Force'), 
     ('GEO', 'Geographic Theater'), 
     ('SHIP', 'Federation Vessel Chapter') 
    ) 
    Unit_name = models.CharField(max_length=30) 
    Hull_number = models.CharField(max_length=30) 
    Hull_type = models.CharField(max_length=4, choices=HType) 
    Parent_unit = models.ForeignKey("self", blank=True, null=True) 
    Class = models.ForeignKey(Class) 
    email = models.CharField(max_length=50, default='') 
    Member = models.ManyToManyField(Member, through='MemberUnit') 
    Address = models.CharField(max_length=500, default='') 
    City = models.CharField(max_length=50, default='') 
    State = models.CharField(max_length=2, default='') 
    Zip = models.IntegerField() 

    def __str__(self): 
     return self.Unit_name 

class Class(models.Model): 
    class_type = models.CharField(max_length=30) 
    class_name = models.CharField(max_length=20, unique=True) 
    class_description = models.CharField(max_length=5000) 

    def __str__(self): 
     return self.class_name 

如果我能得到這種查詢的一個例子,我相信我可以用類似的查詢卷,例如通過使用此。我將不勝感激任何幫助。

謝謝。

+0

只是爲了澄清,你想看看哪些MemberUnit對象的Position_name是「指揮官」?編輯:或者,給定一個會員,你需要一個MemberUnit's的名單,他的ClassPosition的Position_name是「指揮官」? – user2719875

+0

謝謝。請扭轉這一點。給定一個單位,我需要該單位的「指揮官」。非常感謝。 – arcee123

+0

@ acree123給定一個Unit對象?因爲你沒有上傳「單元」模型。你能否更新你的文章以包含「單元」模型? – user2719875

回答

1

我認爲這可能是你正在尋找的情況。 嘗試一下;未經測試;

unit_object = unit object which you already have; 
member_unit = MemberUnit.objects.filter(unit=unit_object, Position__unit_position=Position.objects.get(Position_name='Commanding Officer')) 

在這裏你可以做一個forloop並獲得所有成員的名字;

for members in member_unit: 
    print members.Member.first_name 

或者您可以獲取成員名稱列表,如:

member_names = MemberUnit.objects.filter(unit=unit_object, Position__unit_position=Position.objects.get(Position_name='Commanding Officer')).values_list('Member__first_name', flat=True)