Django: избежать ограничения типа данных - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть класс, который имеет IntegerField атрибут.В его ModelForm, в поле этого атрибута, мне нужно отправить строку, которая позже будет хранить целое число, как только оно будет обработано в представлении.Проблема в том, что Django не позволяет этого, и когда я использую form.cleaned_data.get('myattr'), он говорит, что это неправильно, потому что это должно быть целое число.

class Student(models.Model):
    teacher = models.IntegerField(null=False) # I'm saving teacher's key here


class Teacher(models.Model:
    name = models.CharField(max_length= 50, null=False)
    key = models.IntegerField(null=False)


class StudentForm(forms.ModelForm):
    teacher = forms.ModelChoiceField(queryset=Teacher.objects.all(), label='Select the teacher')

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

views.py:

teacher = form.cleaned_data.get('teacher') # it has the name
teacher = Teacher.objects.get(name=teacher).key # getting the key in order to store an Integer, but Django is banning my code before anyway.

Как я могу справиться с этим, не меняя тип данных модели?

Я даже добавил to_field_name в поле формы со значением ключа учителя.

1 Ответ

2 голосов
/ 08 апреля 2019

Одним из лучших подходов здесь будет установление отношений между вашим учеником и учителем (с помощью клавиши foregin).

В зависимости от необходимости вашего приложения, вот как это сделать:

Если у одного ученика может быть несколько учителей, а у одного учителя может быть несколько учеников: https://docs.djangoproject.com/en/2.1/topics/db/examples/many_to_many/

Если у одного ученика может быть только один учитель, но у учителя может быть несколько учеников: https://docs.djangoproject.com/en/2.1/topics/db/examples/many_to_one/

Если у одного ученика может быть только один учитель, а у одного учителя может быть только один ученик: https://docs.djangoproject.com/en/2.1/topics/db/examples/one_to_one/

Это лучший способ справиться с этим. Тогда вам нужно только сопоставить модель ученика в форме ученика, например:

class StudentForm(forms.ModelForm):
    class Meta:
        model = Student
        #you can add the list of all the fields you want there
        fields = ['teacher']

Одним дополнительным шагом будет определение метода str модели, чтобы Django связывал строковое представление вашей модели в вашей форме (здесь есть хороший способ отобразить Учителя в форме студента). .

class Teacher(models.Model):
    name = models.CharField(max_length= 50, null=False)
    #place other fields here ...

    def __str__(self):
        #if you print a Teacher django will return the string corresponding to the teacher name
        return self.name
...