Проблема Django ModelMultipleChoiceField для сохранения данных в БД

Раньше в моей форме было поле выбора нескольких значений, заполненное списком JSON.

формы.py

      FRUIT_CHOICES= [
    ('Oranges', 'Oranges'),
    ('Cantaloupes', 'Cantaloupes'),
    ('Mangoes', 'Mangoes'),
    ('Honeydews', 'Honeydews')
    ]

class AddRecordForm(forms.ModelForm):
    testrever = forms.MultipleChoiceField(choices=FRUIT_CHOICES)

Итак, я использовал поле JSON в своем файле models.py вот так:

модели.py

      class Record(models.Model):
    testrever = models.JSONField(max_length=500)

Это сработало как чудо, и я смог сохранить выделение и загрузить его обратно при вызове формы.

Но теперь вforms.pyмне нужно изменитьforms.MultipleChoiceFieldкforms.ModelMultipleChoiceFieldкоторый заполняется таким набором запросов

      class AddRecordForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        self.storage_pk = kwargs.pop('pk')
        super(AddRecordForm, self).__init__(*args, **kwargs)
        self.fields['testrever'].queryset = BDC.objects.filter(ref=self.storage_pk).values_list('model', flat=True) 


    testrever = forms.ModelMultipleChoiceField(widget=forms.widgets.SelectMultiple, queryset=None)

class Meta:
    model = Record
    exclude = ("user",)
    fields = ['id','first_name','last_name','email', 'phone' ,'address', 'city' ,'state' ,'zipcode' ,'regarde' ,'testrever']

Итак, теперь мойmodels.JSONFieldin больше не работает, поскольку я больше не отображаю формат списка JSON.

Какое поле мне следует использовать в models.pyчтобы заставить его снова работать?

1 ответ

Если вы выбираете ноль, один или несколько элементов другой модели, вы используете ManyToManyField [Djangp-док]:

      class Fruit(models.Model):
    name = models.CharField(max_length=128, unique=True)

    def __str__(self):
        return name


class Record(models.Model):
    testrever = models.ManyToManyField(Fruit, blank=True)

При этом также используетсяModelMultipleChoiceполе как поле формы по умолчанию. Так что вам нужно всего лишь подключить другой виджет:

      class RecordForm(forms.ModelForm):
    class Meta:
        model = Record
        fields = '__all__'
        widgets = {'testrever': forms.SelectMultiple}

хотя в настоящее время большинство баз данных предлагают поле JSON, которое полезно для неструктурированных данных, для структурированных данных с использованиемJSONFieldэто не очень хорошая идея, поскольку она нарушает первую нормальную форму  [вики].

Другие вопросы по тегам