【问题标题】:How to write a Serializer for array data in REST API in Django Rest Framework?如何在 Django Rest Framework 的 REST API 中为数组数据编写序列化程序?
【发布时间】:2015-06-11 07:16:47
【问题描述】:

我在 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)

一个理想的 json post 请求应该是这样的

{
    email:"abhishek@gmail.com"
    preference : [ 'books', 'food', 'lifestyle', 'travel']
}

我希望将此 json 模式保存到 UserPreference 模型中。这需要多次插入以供偏好。什么是好的序列化器设计?

我试过了

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

【问题讨论】:

  • Customer 模型是否与 User 有任何关系?
  • @mariodev 感谢您的建议。我已将客户编辑为用户。
  • 您应该为偏好编写自己的模型,并使用 UserPreference 中的多对多字段,或偏好模型中的 ForeignKey。
  • @jaakko 我相信这是正确的行为,但我已经将我的实际大型用例剥离到我遇到问题的部分。
  • 这两个答案都有效吗?

标签: django rest django-rest-framework


【解决方案1】:

你可以使用 Django Rest Framework 的StringRelatedField

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

models.py(把related_name放在那里)

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

序列化器.py

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

    class Meta:
        model = User
        fields = ('email_id', 'preference')

【讨论】:

    【解决方案2】:

    你可以这样制作模型:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多