Django:如何在使用自定义中间体 table 时 limit_choices_to

Django: How to limit_choices_to when using custom intermediate table

首先让我说我正在使用遗留数据库,因此避免使用自定义中间体 table 不是一种选择。

我正在寻找获得 limit_choices_to 功能的替代方法,因为我只需要在我的 ModelForm 的 Sampletype 模型中显示由 sample_option 布尔值标记的选项:

class PlanetForm(ModelForm):
    class Meta:
        model = Planet
        fields = ['name', 'samples']

这是我的模型的简化视图

class Planet(models.Model):
    name= models.CharField(unique=True, max_length=256)
    samples = models.ManyToManyField('Sampletype', through='Sample')

class Sample(models.Model):
    planet = models.ForeignKey(Planet, models.DO_NOTHING)
    sampletype = models.ForeignKey('Sampletype', models.DO_NOTHING)

class Sampletype(models.Model):
    name = models.CharField(unique=True, max_length=256)
    sample_option = models.BooleanField(default=True)

Sample是中级table。 通常,如果该项目首先是使用 Django 启动的,我可以将 ManyToManyField 声明定义为:

samples = models.ManyToManyField('Sampletype', limit_choices_to={'sample_option'=True})

但这不是一个选项..那么我如何获得这个功能呢? Django 在他们的文档中明确指出:

limit_choices_to has no effect when used on a ManyToManyField with a custom intermediate table specified using the through parameter.

但他们没有提供有关如何在您拥有自定义中间体时实现该限制的信息 table。

我尝试在 Sample 模型的 ForeignKey 上设置 limit_choices_to 选项,如下所示:

sampletype = models.ForeignKey('Sampletype', models.DO_NOTHING, limit_choices_to={'sample_option': True})

但这没有效果。

奇怪的是,我在网上找不到这个问题的答案,显然其他人必须在他们的项目中这样做,所以我猜解决方案很简单,但我想不通。

在此先感谢您的帮助或建议。

您可以在表单的 __init__ 方法中设置选项:

class PlanetForm(ModelForm):

    class Meta:
        model = Planet
        fields = ['name', 'samples']

    def __init__(self, *args, **kwargs):
         super(PlanetForm, self).__init__(*args, **kwargs)

         sample_choices = list(
             Sampletype.objects.filter(sample_option=True).values_list('id', 'name')
         )
         # set these choices on the 'samples' field.
         self.fields['samples'].choices = sample_choices