简体   繁体   English

Django Rest框架 - Django嵌套序列化器一对多关系

[英]Django Rest Framework - Django Nested serializer One to Many Relations

I have three models : User(django auth model), Consumer, Tasks . 我有三个模型: 用户(django auth模型),消费者,任务

User model and Consumer has one to one relationship and Consumer and Task has one to many relationship. 用户模型和消费者具有一对一的关系,消费者和任务具有一对多的关系。

My model.py goes like this: 我的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)

My serializers.py goes like this: 我的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']

Now what I want to do is, Whenever I save a post a task, it should get save the task and associate itself to the current Consumer. 现在我想要做的是,每当我保存一个任务时,它应该保存任务并将自己与当前的消费者联系起来。

What can be done. 可以做些什么。

Now, whenever I call serializer.save() in my views I can pass a user instance as an argument something like this 现在,每当我在视图中调用serializer.save()时,我都可以将用户实例作为参数传递给像这样的参数

 serializer.save(user=request.user)

And in my serializer create() function I can query the user and than query the consumer with the help of user to associate the task with that user. 在我的序列化器create()函数中,我可以查询用户,而不是在用户的帮助下查询消费者,以将任务与该用户相关联。

I want to know if there is any better way to do this ? 我想知道是否有更好的方法来做到这一点? I'm new to DRF and having hard time learning it. 我是DRF的新手并且很难学习它。

you can Use the same approach that DRF uses for User, write a Custom object like CurrentUserDefault that returns the consumer correspondent to the currently authenticated user: 您可以使用DRF用于User的相同方法,编写一个Custom对象,如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__)

note: you should use the generic view or provide the request for the serializer yourself. 注意:您应该使用通用视图或自己提供序列化程序的请求。

then in your TaskSerializer , add this field: 然后在TaskSerializer中添加以下字段:

class TaskSerializer(serializers.ModelSerializer):

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

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

read my answer to a similar question for more information. 阅读对类似问题的回答以获取更多信息。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM