![](/img/trans.png)
[英]limit_choice_to all objects of a particular model classe in a ForeignKey
[英]Django Foreign Key limit_choice_to with model object filter
我試圖在我的 django 管理工具中限制外鍵的選擇。 我偶然發現了ForeignKey
model 的limit_choices_to
選項: https://docs.djangoproject.com/en/3.2/ref/models/fields/#django.db.models.ForeignKey.limit_choices_to
在我的模型中,我有一個Question_logic
,它有一個屬性ifLogic
,它是 model Options
(代表問題選項的可能答案)的外鍵。
# Models.py
class Options(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
option = models.CharField(max_length=200)
class Question_logic(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
# error here:
ifLogic = models.ForeignKey(Options, on_delete=models.CASCADE, limit_choices_to=Options.objects.filter(question=question))
thenLogic = models.CharField(max_length=200)
但是,這種方法不起作用,因為顯然您無法在 model 定義本身中引用 object 並且我收到此錯誤:
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
我的邏輯非常簡單:我希望管理員只在與特定問題相關的選項之間進行選擇。 我該如何正確實施?
謝謝。
管理員中的外鍵選擇可以通過ModelAdmin.formfield_for_foreignkey()進行限制。 在表單實例化期間,當前 object(即QuestionLogic
)存儲在formfield_for_foreignkey()
方法中可用的請求 object 中。
請注意,object 未存儲在 ModelAdmin object 上,因為它不是線程安全的。
class QuestionLogicAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs)
# Store Question object on request for later retrieval.
request._obj_ = obj
return super().get_form(request, question, **kwargs)
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "ifLogic" and request._obj_:
question = request._obj_.question
kwargs["queryset"] = Options.objects.filter(question=question)
PS:在 Python 中,class 名稱(即 QuestionLogic 而不是 Question_logic)使用 CapitalizedWords 命名約定是很好的做法。 實例變量應該是小寫的,並根據需要用下划線分隔單詞以提高可讀性(即if_logic
而不是ifLogic
)。 您可以在PEP8 風格指南中閱讀相關內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.