Python 模板中的多个关系(反向查找)
我正在尝试构建自己的客户机数据库,但反向查找无法正常工作: models.pyPython 模板中的多个关系(反向查找),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
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。可能不太合适,但效果很好:)