我有一个请求模型,它与RequestDetails具有一对多关系。我也有一个RequestFilter,它与auth.user
有一对一的关系。我想要做的是在通用ListView中显示所有请求,其中至少有一个RequestDetail具有通过RequestFilter设置启用的类别。我尝试以不同的方式完成此操作,但仍以“关系字段不支持嵌套查找”错误结束。下面是我做的:如何筛选关联字段与(动态)列表相比较的查询集
鉴于型号:
用户指定(不Django的user.request)他要接受基于以下RequestFilter模式设置菜单的要求:
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(如其中有很多产品订单S)
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即用户已设置为在设置(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()的表达也试过,但这个不行,因为它只能在同一个模型实例两个不同字段的值进行比较。我得到的最接近是让启用类别的用户和查找列表,如果类别名称是此列表的一个部分:
return Requests.objects.order_by('-date_add').filter(details__get_category_name__in=requestfilter_list)
但是这引起了关系字段不支持嵌套查找错误。
包含get_category模型及其与其他模型的关系。 – schillingt
林不知道,如果我得到你的建议。对于RequestDetail,我通过'def get_category_name:'获得类别名称,并从RequestFilter用户设置中获得通过'def get_categories_enabled:'启用类别名称的列表,这不足以过滤请求queryset,因为我可以关联RequestDetails ? – seeN
您无法在QuerySet过滤器中使用模型方法。 – schillingt