Python Django-将选择限制为依赖于实例的内容

Python Django-将选择限制为依赖于实例的内容,python,django,django-models,django-admin,Python,Django,Django Models,Django Admin,我有一些按类别组织的食物。对于每个类别,我希望能够选择一个优胜者foo 因此,我有这样的模型: class Category(models.Model): name = models.CharField(max_length=30) # More fields... winner = models.ManyToManyField( 'Foo', related_name='winner' ) class Foo(models.Mo

我有一些按类别组织的食物。对于每个类别,我希望能够选择一个优胜者foo

因此,我有这样的模型:

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'
    )
(为什么
winner
是一个
ManyToManyField
的原因是,一个foo可能属于多个类别,而在一个类别中,可能会有多个获胜者,原因是:

我想施加一个自然约束,一个foo只有在属于某个类别时才能在该类别中获胜。最合理的方法似乎是使用参数,但在我看来,不可能根据模型的当前实例限制选择

我可能能够以给定的形式施加此约束,但出于两个原因,我希望避免这种情况:

  • 约束自然存在于模型级别。这是两个相关模型之间应始终保持的特殊关系
  • 优胜者的选择将在管理员中进行,我希望避免必须自定义管理员表单
有没有办法在Django中施加这种约束


无法在模型级别上对M2M字段施加约束(即限制选项)。但是,您可以通过以下形式执行此操作:

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'
    )