Django Complex查询使用过滤器连接表

时间:2015-10-22 03:50:03

标签: python 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

如果我能得到这种查询的一个例子,我相信我可以用类似的查询,通过示例使用它。我很感激我能得到的任何帮助。

谢谢。

1 个答案:

答案 0 :(得分: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)