如何在Django Rest Framework中的REST API中为数组数据编写序列化程序?

Abh*_*hek 2 django rest django-rest-framework

我在Django中编写了基本模型序列化器,其中api模仿了数据模型。现在,我需要将用户首选项存储在数据库中。api包含一个数组。

我的用户模型:

class User(models.Model):
    email_id = models.EmailField(max_length=80, blank=True, primary_key=True)

class UserPreference(models.Model)
    email_id = models.ForeignKey('User')
    preference = models.CharField(maxlength=20)
Run Code Online (Sandbox Code Playgroud)

理想的json发布请求看起来像这样

{
    email:"abhishek@gmail.com"
    preference : [ 'books', 'food', 'lifestyle', 'travel']
}
Run Code Online (Sandbox Code Playgroud)

我希望将此json模式保存到UserPreference模型中。这需要多次插入才能获得优先选择。有什么好的串行器设计呢?

我试过了

class UserPreferenceSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserPreference
        fields = ('email_id', 'preference')
Run Code Online (Sandbox Code Playgroud)

Jaa*_*kko 7

你可以让你的模型是这样的:

class UserPreference(models.Model)
    email_id = models.ForeignKey('User')
    preference = models.ManyToManyField('Preference') #create model for preferences
Run Code Online (Sandbox Code Playgroud)

然后将自定义创建方法添加到您的序列化程序:

def create(self, validated_data):
    user = self.context.get('user') #you can pass context={'user': self.request.user} in your view to the serializer
    up = UserPreference.objects.create(email_id=user)
    up.save()        
    preference = validated_data.get('preference', [])
    up.preference.add(*preference)
    up.save()
    return up
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以使用StringRelatedFieldDjango Rest Framework。

进行以下更改,您将以所需的方式获得响应。

models.py(在其中放入related_name)

class UserPreference(models.Model):
    email_id = models.ForeignKey(User, related_name='preference')
    preference = models.CharField(maxlength=20)
Run Code Online (Sandbox Code Playgroud)

serializers.py

class UserSerializer(serializers.ModelSerializer):
    preference = serializers.StringRelatedField(many=True)

    class Meta:
        model = User
        fields = ('email_id', 'preference')
Run Code Online (Sandbox Code Playgroud)