Python 模板中的多个关系(反向查找)

Python 模板中的多个关系(反向查找),python,django,django-models,django-templates,django-views,Python,Django,Django Models,Django Templates,Django Views,我正在尝试构建自己的客户机数据库,但反向查找无法正常工作: models.py class PersonQuerySet(models.QuerySet): def employees(self): return self.filter(role='E') class PersonManager(models.Manager): def get_queryset(self): return PersonQuerySet(self.model, u

我正在尝试构建自己的客户机数据库,但反向查找无法正常工作:

models.py

class PersonQuerySet(models.QuerySet):
    def employees(self):
        return self.filter(role='E')

class PersonManager(models.Manager):
    def get_queryset(self):
        return PersonQuerySet(self.model, using=self._db)
    def employees(self):
        return self.get_queryset().employees()

class Person(models.Model):
    people = PersonManager()
    role = models.CharField(max_length=1,
    choices = (('C', _('Client')),('E', _('Employee'))))

class Organization(models.Model):
    employees = models.ManyToManyField(
        Employee,
        limit_choices_to=Q(role='E'),
        related_name='organization_employees',
        related_query_name='organization_employee',)
class Person(models.Model):
     def get_organization(self):
        with connection.cursor() as cursor:
            cursor.execute('SELECT organization_id FROM clients_organization_employees WHERE employee_id = %s', [self.id])
            organization_id = cursor.fetchone()
            cursor.execute('SELECT name FROM clients_organization WHERE id = %s', [organization_id[0]])
            organization_name = cursor.fetchone()

        for x in organization_name:
            return x
views.py

class PersonDetail(DetailView):
    model = Person
    template_name = 'clients/person_detail.html'
Organization类与多个员工(Person类)建立了多个关系。每个员工的DetailView(模板“person\u detail.html”)现在可以显示每个员工所属的组织,我认为类似person.Organization.name

我已经尝试过这个方法和其他很多方法,但到目前为止还没有成功,我只是不明白为什么我会被绊倒

<ul>
{% for organization in people.organization_set.all %}
    {{ organization.name }}
{% endfor %}
</ul>
    {people.organization_set.all%} {{organization.name} {%endfor%}

非常感谢您的帮助:)

我认为您不能从QuerySet调用许多反向查找,而只能调用模型的一个实例。您可以使用此选项:

<ul>
{% for person in people %}
    {% for organization in person.organization_set.all %}
        {{ organization.name }}
    {% endfor %}
{% endfor %}
</ul>

我认为您不能从QuerySet调用许多反向查找,只能调用模型的一个实例。您可以使用此选项:

<ul>
{% for person in people %}
    {% for organization in person.organization_set.all %}
        {{ organization.name }}
    {% endfor %}
{% endfor %}
</ul>

如果我在Person(models.Model)类中添加一个def并执行自定义sql,我发现了一个不同的解决方案

models.py

class PersonQuerySet(models.QuerySet):
    def employees(self):
        return self.filter(role='E')

class PersonManager(models.Manager):
    def get_queryset(self):
        return PersonQuerySet(self.model, using=self._db)
    def employees(self):
        return self.get_queryset().employees()

class Person(models.Model):
    people = PersonManager()
    role = models.CharField(max_length=1,
    choices = (('C', _('Client')),('E', _('Employee'))))

class Organization(models.Model):
    employees = models.ManyToManyField(
        Employee,
        limit_choices_to=Q(role='E'),
        related_name='organization_employees',
        related_query_name='organization_employee',)
class Person(models.Model):
     def get_organization(self):
        with connection.cursor() as cursor:
            cursor.execute('SELECT organization_id FROM clients_organization_employees WHERE employee_id = %s', [self.id])
            organization_id = cursor.fetchone()
            cursor.execute('SELECT name FROM clients_organization WHERE id = %s', [organization_id[0]])
            organization_name = cursor.fetchone()

        for x in organization_name:
            return x
在模板中,我现在可以调用

{{ person.get_organization }}

我总能找到合适的组织,每个员工都属于这个组织

如果我在Person(models.Model)类中添加一个def并执行自定义sql,我发现了一个不同的解决方案

models.py

class PersonQuerySet(models.QuerySet):
    def employees(self):
        return self.filter(role='E')

class PersonManager(models.Manager):
    def get_queryset(self):
        return PersonQuerySet(self.model, using=self._db)
    def employees(self):
        return self.get_queryset().employees()

class Person(models.Model):
    people = PersonManager()
    role = models.CharField(max_length=1,
    choices = (('C', _('Client')),('E', _('Employee'))))

class Organization(models.Model):
    employees = models.ManyToManyField(
        Employee,
        limit_choices_to=Q(role='E'),
        related_name='organization_employees',
        related_query_name='organization_employee',)
class Person(models.Model):
     def get_organization(self):
        with connection.cursor() as cursor:
            cursor.execute('SELECT organization_id FROM clients_organization_employees WHERE employee_id = %s', [self.id])
            organization_id = cursor.fetchone()
            cursor.execute('SELECT name FROM clients_organization WHERE id = %s', [organization_id[0]])
            organization_name = cursor.fetchone()

        for x in organization_name:
            return x
在模板中,我现在可以调用

{{ person.get_organization }}

我总能找到合适的组织,每个员工都属于这个组织

人来自哪里?您显示的PersonDetail视图不会添加该变量。你是说
person
?这些人来自“person类”:people=PersonManager()。我使用它来调用额外的Employee类:Class Employee(Person),如下所示:people.Employee。但我认为在这种情况下,我应该使用person.organization\u set.all。你说得对。但是这也不行。
人来自哪里?您显示的PersonDetail视图不会添加该变量。你是说
person
?这些人来自“person类”:people=PersonManager()。我使用它来调用额外的Employee类:Class Employee(Person),如下所示:people.Employee。但我认为在这种情况下,我应该使用person.organization\u set.all。你说得对。但那也不行。谢谢你的建议。我认为我的代码中仍然有错误。它不起作用了。views.py PersonDetail类可能有问题吗?我试图添加一个def get_context_数据(self,**kwargs),但也没有效果。但是我发现了一个完全不同的解决方案,向Person(models.models)类添加了一个新的def,并以connection.cursor()作为游标执行定制sql。可能不太合适,但效果很好:)谢谢你的建议,ARJMP。我认为我的代码中仍然有错误。它不起作用了。views.py PersonDetail类可能有问题吗?我试图添加一个def get_context_数据(self,**kwargs),但也没有效果。但是我发现了一个完全不同的解决方案,向Person(models.models)类添加了一个新的def,并以connection.cursor()作为游标执行定制sql。可能不太合适,但效果很好:)