【发布时间】:2015-10-10 17:25:16
【问题描述】:
我有一个与其 RequestDetails 具有一对多关系的请求模型。我还有一个与auth.user 一对一关系的 RequestFilter。我想要做的是在通用 ListView 中显示所有请求,其中至少有一个 RequestDetail 具有由 RequestFilter 设置启用的类别。我尝试以不同的方式完成此操作,但最终还是出现“关系字段不支持嵌套查找”错误。这是我所做的:
给定模型:
用户根据以下 RequestFilter 模型在设置菜单中指定他想要接收的请求(不是 django user.request):
class RequestFilter(models.Model):
user = models.OneToOneField(User)
category1_enabled = models.BooleanField(...)
category2_enabled = models.BooleanField(...)
category3_enabled = models.BooleanField(...)
...
def get_categories_enabled(self):
returns a list of category names which are set to True e.g. ['category1', 'category3']
请求本身包含基本信息和参考代码:
class Requests(models.Model):
request_id = models.IntegerField(unique=True, ...)
reference = models.CharField(max_length=10)
some_general_info = models.CharField(...)
...
一个请求可以有多个 RequestDetails(例如具有多个产品的订单)
class RequestDetail(models.Model):
request = models.ForeignKey(Requests, to_field='request_id', related_name='details')
product_id = models.IntegerField()
category_id = models.IntegerField()
...
def get_category_name:
returns the name of the category of the RequestDetail e.g. 'category3'
我有一个基于通用类的 ListView,它应该显示包含至少一个 RequestDetail 的所有请求,该 RequestDetail 属于用户在设置中设置为启用的类别 (RequestFilter)。
views.py
class DashManagerRequestsView(generic.ListView):
template_name = 'dashboard/dashmanagerrequests.html'
context_object_name = 'request_list'
def get_categories_enabled(self):
return self.request.user.requestfilter.get_categories_enabled()
def get_queryset(self):
"""Returns all requests as an ordered list."""
requestfilter_list = self.get_categories_enabled()
return Requests.objects.order_by('-date_add').filter(details__get_category_name__in=requestfilter_list)
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(DashManagerRequestsView, self).dispatch(*args, **kwargs)
我也尝试使用 F() 表达式,但这不起作用,因为它只比较 SAME 模型实例上两个不同字段的值。我得到的最接近的是获取用户启用类别的列表,如果类别名称是此列表的一部分,则查找:
return Requests.objects.order_by('-date_add').filter(details__get_category_name__in=requestfilter_list)
但这会引发关系字段不支持嵌套查找错误。
【问题讨论】:
-
包括 get_category 模型及其与其他模型的关系。
-
我不确定我是否明白你的建议。对于 RequestDetail,我通过
def get_category_name:获得类别名称,从 RequestFilter 用户设置中,我通过def get_categories_enabled:获得启用的类别名称列表,这还不足以过滤 Requests 查询集,因为我可以与 RequestDetails 相关联吗? -
您不能在 QuerySet 过滤器中使用模型方法。
标签: django django-models django-queryset django-orm