2011-10-06 31 views
8

我有一些組織成類別的foos。對於每個類別,我希望能夠選擇一個優勝者foo。Django - 將選擇的範圍限制在取決於實例的東西

因此,我有模型看起來像這樣:

class Category(models.Model): 
    name = models.CharField(max_length=30) 
    # More fields... 
    winner = models.ManyToManyField(
     'Foo', 
     related_name='winner' 
    ) 

class Foo(models.Model): 
    name = models.CharField(max_length=30) 
    # More fields... 
    category = models.ForeignKey(
     Category, 
     related_name='category' 
    ) 

(之所以winnerManyToManyField是一個FOO可能屬於幾個類別,而在單一品類可能有不止一個)

我想強加一個自然約束條件,即只有屬於該類別的某個類別的foo才能贏得類別。最合理的做法似乎是使用limit_choices_to參數,但在我看來,根據模型的當前實例限制選擇是不可能的。

我也許能夠在給定的形式強加此約束,但我想避免這種情況的原因有兩個:

  • 約束自然生活在模型級別。這是一個特別的關係,應始終兩個相關模型
  • 贏家的選擇將在管理進行,我想,以避免自定義管理之間保持形成

有任何方式在Django中強加這個約束?

回答

4

沒有辦法在模型層面對M2M字段施加約束(即使用limit_choices_to)。不過,你可以這樣做:

class MyForm(forms.ModelForm): 
    class Meta: 
     model = models.Category 

    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     if 'instance' in kwargs: 
      my_category = kwargs['instance'] 
      self.fields['winner'].queryset = my_category.category.all() 

那麼,你有沒有注意到?

my_category.category.all() 

也許你想要的是:

class Foo(models.Model): 
    name = models.CharField(max_length=30) 
    # More fields... 
    category = models.ForeignKey(
     Category, 
     related_name='participants' 
    )