Python Django:在views.py中使用向后关系

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):

我试图将一个对象传递给我的HTML模板,该模板由父对象和与之相关的所有子对象组成。例如:

模型室:

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票!并感谢您提供有关改进查询的提示。随着项目的发展,这应该会有所帮助,我会添加其他查询。非常感谢,这是完美的,正是我所需要的。