Python Django-将选择限制为依赖于实例的内容
我有一些按类别组织的食物。对于每个类别,我希望能够选择一个优胜者foo 因此,我有这样的模型: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
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只有在属于某个类别时才能在该类别中获胜。最合理的方法似乎是使用参数,但在我看来,不可能根据模型的当前实例限制选择
我可能能够以给定的形式施加此约束,但出于两个原因,我希望避免这种情况:
- 约束自然存在于模型级别。这是两个相关模型之间应始终保持的特殊关系
- 优胜者的选择将在管理员中进行,我希望避免必须自定义管理员表单
无法在模型级别上对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'
)