Python Django:在views.py中使用向后关系
我试图将一个对象传递给我的HTML模板,该模板由父对象和与之相关的所有子对象组成。例如: 模型室:Python Django:在views.py中使用向后关系,python,django,django-views,foreign-keys,Python,Django,Django Views,Foreign Keys,我试图将一个对象传递给我的HTML模板,该模板由父对象和与之相关的所有子对象组成。例如: 模型室: class Chamber(models.Model): chamber_name = models.CharField(max_length=100) customer = models.ForeignKey(Customer, on_delete=models.CASCADE) 具有以下特性: class ChamberProperty(models.Model):
class Chamber(models.Model):
chamber_name = models.CharField(max_length=100)
customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
具有以下特性:
class ChamberProperty(models.Model):
chamber = models.ForeignKey(Chamber, on_delete=models.CASCADE)
property_name = models.CharField(max_length=50)
property_value = models.CharField(max_length=100)
user_defined = models.BooleanField(default=True)
它们是两种不同的型号,因为客户可以向其房间添加任意数量的属性
在我看来.py
class ChambersView(generic.DetailView):
template_name = 'pages/chambers.html'
def get(self, request):
user = User.objects.get(username=request.user)
customer = Customer.objects.get(user=user)
chambers_list = list(Chamber.objects.filter(customer=customer))
try:
chamber_properties = list(ChamberProperty.objects.filter(chamber__in=chambers_list).order_by('id'))
except:
chamber_properties = "No properties"
form = ChambersFilterForm(request=request)
return render(request, self.template_name, {'filter_form':form, 'chambers_list': chambers_list, 'chamber_properties': chamber_properties})
现在,这确实给了我一份所有房间的清单,一份所有房间属性的清单。只是它们之间没有联系。我不知道如何建立相关对象的列表。我刚刚读到了关于反向关系的文章,但我似乎不知道如何使用它们
我尝试了以下方法:
chambers_and_props = Chamber.chamberproperty_set.all()
我得到以下错误:
AttributeError: 'ReverseManyToOneDescriptor' object has no attribute 'all'
所以我不太确定如何使用它。我看到的线程提到Django中的关系会自动在ForeignKeys上添加一个反转,用法应该是parent.child\u set.all()
,并带有child
的小写字母
我得到了一个ReverserManyToOneDescriptor
对象,但不知道如何将其转化为一个可用列表,以便传递给HTML模板
关于我做错了什么有什么想法吗?您的查询不起作用,因为您没有指定要获取向后关系的商会 然而,这不是正确的方法。您可能需要ChamberProperty,以便可以针对模板中的每个腔室列出它们。因此,您应该遵循模板中的关系-根本不需要在视图中单独查询ChamberProperty
{% for chamber in chamber_list %}
{{ chamber.chamber_name }}
{% for property in chamber.chamberproperty_set.all %}
{{ property.property_name }} : {{ property.property_value }}
{% endfor %}
{% endfor %}
您得到错误是因为您正在尝试对模型
Chamber
进行Chamber.chamberproperty\u设置。它将在单个腔室
实例上工作:
您可以在视图中执行此操作:
for chamber in chambers_list
properties = chamber.chamberproperty_set.all()
或在模板中:
{% for chamber in chambers_list %}
{{ chamber }}
{% for property in chamber.chamberproperty_set.all %}
{{ property }}
{% endfor %}
然后,在您的视图中,您可以使用来减少SQL查询的数量:
chambers_list = Chamber.objects.filter(customer=customer).prefetch_related('chamberproperty_set')
多谢各位。我现在明白我做错了什么,以及如何使用它。非常有启发性和鼓励性!可惜我只投了1票!并感谢您提供有关改进查询的提示。随着项目的发展,这应该会有所帮助,我会添加其他查询。非常感谢,这是完美的,正是我所需要的。