我有一個請求模型,它與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