簡體   English   中英

Django 外鍵 limit_choice_to 帶 model object 過濾器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM