2015-04-06 53 views
1

我已经在Django中编写了基本模型序列化器,其中API模拟了数据模型。我现在有要求将用户偏好存储在数据库中。 api包含一个数组。如何在Django Rest Framework的REST 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) 

理想的JSON POST请求会是这个样子

{ 
    email:"[email protected]" 
    preference : [ 'books', 'food', 'lifestyle', 'travel'] 
} 

我想这个JSON模式保存到UserPreference模型。这需要多个插入选项。什么将是一个很好的串行器设计呢?

我试图

class UserPreferenceSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = UserPreference 
     fields = ('email_id', 'preference') 
+1

“客户”模型是否以任何方式与“用户”相关? – mariodev

+0

@mariodev感谢您的建议。我已将客户编辑为用户。 – Abhishek

+0

您应该为首选项编写自己的模型,并使用UserPreference中的多对多字段或偏好模型中的ForeignKey。 – Jaakko

回答

3

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

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

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

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 
4

你可以使用Django的REST框架的StringRelatedField

使下面的变化,你会得到你想要的方式的反应。

models.py(放related_name有)

class UserPreference(models.Model): 
    email_id = models.ForeignKey(User, related_name='preference') 
    preference = models.CharField(maxlength=20) 

serializers.py

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

    class Meta: 
     model = User 
     fields = ('email_id', 'preference') 
相关问题