Проблемы при определении внешнего ключа Django из CharField DataType - PullRequest
0 голосов
/ 08 октября 2019

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

class Localities(models.Model):
    id = models.BigAutoField(primary_key=True)
    field_id = models.CharField(unique=True, max_length=50,db_column='field_id')

    class Meta:
        managed = False
        db_table = 'localities'

class Stratigraphy(models.Model):
    id = models.BigAutoField(primary_key=True)
    locality = models.ForeignKey(Localities, models.DO_NOTHING, blank=True, null=True, related_name='locality_id')

    class Meta:
        managed = False
        db_table = 'stratigraphy'

Стратиграфия модели связана с моделью Localitiesк чардфилду field_id при создании сериализатора для создания JSON с данными я получил это

class BedSerializer(ModelSerializer):

    class Meta:
        model = Stratigraphy
        fields = '__all__'
        depth = 1

когда я пытаюсь API с почтальоном, он показывает мне следующие

class BedSerializer(ModelSerializer):

    class Meta:
        model = Stratigraphy
        fields = ('id','locality')

но если я уберу атрибут глубины, он покажет мне следующее

Что я делаю не так?

1 Ответ

0 голосов
/ 08 октября 2019

Согласно документации Django REST Framework на ModelSerializer: https://www.django -rest-framework.org / api-guide / serializers / # modelserializer

По умолчанию все поля моделиКласс будет сопоставлен с соответствующими полями сериализатора.

Это отличается от ModelForms Джанго, который требует, чтобы вы указали специальный атрибут '__all__', чтобы использовать все поля модели. Поэтому все, что необходимо, - это объявить модель.

class BedSerializer(ModelSerializer):

    class Meta:
        model = Stratigraphy
        depth = 1

Обновление (для версий> = 3.5) Описанное выше поведение устарело в версии 3.3 и запрещено с версии 3.5.

Теперь обязательно использовать специальный атрибут ' all ', чтобы использовать все поля в Django REST Framework, так же как и Django Forms:

Невозможно задать либо поля, либо исключить возникшие ожиданияпредупреждение об устаревании в версии 3.3 и предупреждение об устаревании в версии 3.4. Его использование теперь является обязательным.

Так что теперь оно должно быть:

класс BedSerializer (ModelSerializer):

class Meta:
    model = Stratigraphy
    fields = '__all__'
    depth = 1

Ответ, вдохновленный ответом на эту тему: Все поля в ModelSerializer django rest framework

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...