我通過中間表在Feature模型和模型之間建立了 m2m 關系。User特征模型代表所有可用的特征,用戶可以通過 web 或 api 啟用或禁用零個、一個或多個。當用戶啟用功能時,在中間表中創建相應的記錄,當用戶禁用功能時,記錄被洗掉。
from django.contrib.auth.models import User
class Feature(models.Model):
name = models.CharField(max_length=50)
user = models.ManyToManyField(User, through='FeatureUserM2M')
...other fields...
class FeatureUserM2M(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
feature = models.ForeignKey(Feature, on_delete=models.CASCADE)
...other fields...
假設這樣的資料
Feature User Intermediary
|id|name | |id|name | |id|user_id|feature_id|
-- ------------ -- ------- -- ------- ----------
|1 |feature foo | |1 |user A | |1 |2 |1 |
|2 |feature bar | |2 |user B | | | | |
|3 |feature baz | | | | | | | |
我需要一個包含所有可用功能的結果,對于給定的用戶,另一個欄位指示用戶是否啟用了該功能(可能是布林值)。理想情況下,對于“用戶 A”,我需要的結果是:
|user_id|feature_id|enabled |
------- ---------- --------
|2 |1 | true |
|2 |2 | false |
|2 |3 | false |
我試過了
Feature.objects.annotate(enabled=Subquery(
FeatureUserM2M.objects.filter(
feature=OuterRef('pk'),
user=request.user,
)
))
*** django.core.exceptions.FieldError: Cannot resolve expression type, unknown output_field
我不認為我所做的查詢是正確的,但即使指定輸出型別,因為BooleanField我沒有我想要的。
Feature.objects.annotate(enabled=Subquery(
FeatureUserM2M.objects.filter(
feature=OuterRef('pk'),
user=request.user,
)), output_field=BooleanField
)
*** TypeError: QuerySet.annotate() received non-expression(s): <class 'django.db.models.fields.BooleanField'>.
uj5u.com熱心網友回復:
似乎您可以只使用Exists()子查詢。它的示例和描述在此處的檔案中:
子查詢 - 存在
Feature.objects.annotate(enabled=Exists(
FeatureUserM2M.objects.filter(
feature=OuterRef('pk'),
user=request.user,
)
))
但是,您非常接近正確答案,我所做的只是進一步閱讀了檔案并將您的替換Subquery為Exists:)
您第二次嘗試導致錯誤的原因可能是正確的,將像這樣修復:
Feature.objects.annotate(enabled=Subquery(
FeatureUserM2M.objects.filter(
feature=OuterRef('pk'),
user=request.user,
), output_field=BooleanField) # <-- moved the parenthesis
)
這在此處的檔案中進行了描述:
子查詢
您可以在其中指定關鍵字引數output_field,但實際上您將其放置在.annotate(...)
但我并不完全相信這將是相同的結果輸出,就Exists(...)好像說了那樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/529151.html
上一篇:如何從視圖呼叫驗證函式到模板?
下一篇:'error:canonlyconcatenatestr/tuple(not"tuple/str)tostr/tuple'向UserCreationForm添加欄位時出錯
