Django: как limit_choices_to при использовании пользовательской промежуточной таблицы

Позвольте мне начать с того, что я работаю с устаревшей базой данных, поэтому избегать пользовательской промежуточной таблицы нельзя.

Я ищу альтернативный способ получить limit_choices_to функциональность, так как мне нужно только представить параметры, отмеченные sample_option логическое в Sampletype Модель в моей ModelForm:

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 это промежуточная таблица. Обычно, если бы проект был начат с Django, я мог бы просто определить объявление ManyToManyField следующим образом:

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

Но это не вариант.. Так как я могу получить эту функциональность? Джанго четко заявляет в своей документации, что:

limit_choices_to не имеет никакого эффекта, когда используется на ManyToManyField с пользовательской промежуточной таблицей, указанной с помощью параметра through.

Но они не предлагают никакой информации о том, как установить этот лимит, когда у вас действительно есть промежуточная таблица.

Я пытался установить limit_choices_to вариант на ForeignKey в Sample Модель вроде так:

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

но это не имело никакого эффекта.

Странно, я не нахожу ответа на этот вопрос в Интернете, и очевидно, что другие люди должны делать это в своих проектах, поэтому я предполагаю, что решение действительно простое, но я не могу понять это.

Заранее спасибо за любую помощь или предложения.

1 ответ

Решение

Вы можете установить выбор в __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
Другие вопросы по тегам