Django Rest Framework - Вложенный сериализатор Django Отношения один ко многим - PullRequest
0 голосов
/ 27 августа 2018

У меня есть три модели: Пользователь (модель аутентификации django), Потребитель, Задачи .

Модель пользователя и Потребитель имеет отношение один к одному, а Потребитель и Задача - один к одномумного отношений.

Мой model.py выглядит так:

class Consumer(models.Model):
    user=models.OneToOneField(User,on_delete=models.CASCADE)    
    average_rating=models.FloatField(default=5.0)

class Tasks(models.Model):

    consumer=models.ForeignKey(Consumer,on_delete=models.CASCADE,related_name='consumer_obj')
    title=models.CharField(max_length=50)
    description=models.CharField(max_length=200)
    added_on=models.DateTimeField(auto_now=True)

Мой serializers.py выглядит так:

class TaskSerializer(serializers.ModelSerializer):

    category=serializers.CharField(max_length=10)
    class Meta:
        model=Tasks
        fields=['title','description']

class UserSerializer(serializers.ModelSerializer):
    password=serializers.CharField(max_length=10,write_only=True)
    class Meta:
        model=User 
        fields=['username','password','email']


class ConsumerSerializer(serializers.ModelSerializer):
    user=UserSerializer()
    tasks=TaskSerializer(many=True,source='consumer_obj')
    class Meta:
        model=Consumer
        fields=['user','average_rating','tasks']

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

Что может бытьготово.

Теперь, всякий раз, когда я вызываю serializer.save () в своих представлениях, я могу передать пользовательский экземпляр в качестве аргумента примерно так:

 serializer.save(user=request.user)

И в моем сериализаторе создать() Функция Я могу запросить пользователя и затем запросить потребителя с помощью пользователя, чтобы связать задачу с этим пользователем.

Я хочу знать, есть ли лучший способ сделать это?Я новичок в DRF и с трудом изучаю его.

1 Ответ

0 голосов
/ 27 августа 2018

Вы можете использовать тот же подход, который DRF использует для Пользователя, написать пользовательский объект, такой как CurrentUserDefault, который возвращает корреспондента-потребителя в настоящее время аутентифицированному пользователю:

from rest_framework.compat import unicode_to_repr

class CurrentConsumerDefault(object):
    def set_context(self, serializer_field):
        user = serializer_field.context['request'].user
        self.consumer = user.consumer

    def __call__(self):
        return self.consumer

    def __repr__(self):
        return unicode_to_repr('%s()' % self.__class__.__name__)

примечание: вы должны использовать общий вид или предоставить запрос на сериализатор самостоятельно.

затем в вашем TaskSerializer добавьте это поле:

class TaskSerializer(serializers.ModelSerializer):

    consumer=serializers.HiddenField(default=CurrentConsumerDefault())

    class Meta:
        model=Tasks
        fields=['title','description', 'consumer']

прочитайте мой ответ на аналогичный вопрос для получения дополнительной информации.

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