Настройка Model Serializer для множества полей в Django - PullRequest
0 голосов
/ 17 сентября 2018

Мне нужно некоторое руководство для реализации сериализаторов для моделей, содержащих много-много полей в обобщенном виде.Предположим, у меня есть следующие (чрезвычайно упрощенные) модели:

class Operative(models.Model):
    name = models.CharField(max_length=256, blank=False)    
    email = models.EmailField(unique=True, null=True)
    desiganation = models.PositiveSmallIntegerField(default=0, choices=((0, 'Operative'), (1, 'Manager'), (2, 'Owner')))


class Task(models.Model):
    title = models.CharField(max_length=256, blank=False)
    manager = models.ForeignKey(Operative, null=True,on_delete=models.SET_NULL)
    operatives = models.ManyToManyField(Operative, blank=True)
    deadline = models.DateTimeField(null=True, blank=True)

Теперь, если у меня есть такой сериализатор:

class TaskSerializer(ModelSerializer):

    class Meta:
        model = Task
        fields = ('id', 'title', 'manager', 'operatives', 'deadline')
        read_only_fields = ('id',)

Каков наилучший подход для обработки запросов на обновление, содержащихцелые идентификаторы для менеджера и оперативников?API обновления будет получать POST-запросы, содержащие данные json, например:

{
    "id": 1002,
    "title": "Task1",
    "deadline": "2018-09-15T15:53:00+05:00",
    "manager": 55,
    "operatives": [102, 110, 324]
}

Я хотел бы реализовать настраиваемую логику для внешних ключей и много-много полей внутри сериализатора.В настоящее время я использую некоторые вспомогательные методы в представлении для получения / установки идентификаторов для оперативников и менеджера, и это кажется немного неуклюжим.

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

ModelSerializer обрабатывает внешние ключи и многие ко многим отношениям.Вы должны переопределить create(self, validated_data) и update(self, instance, validated_data) метод для настройки сохранения и манипулирования данными.

0 голосов
/ 17 сентября 2018

Не работает ли нижеуказанное?

class TaskSerializer(ModelSerializer):

    manager = serializers.PrimaryKeyRelatedField()
    operatives = serializers.PrimaryKeyRelatedField(many=True)

    class Meta:
        model = Task
        fields = ('id', 'title', 'manager', 'operatives', 'deadline')
        read_only_fields = ('id',)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...