如何通过使用models.py,serializers.py和views.py将解析的json数组值保存到Django python rest api中的数据库中

问题描述 投票:1回答:1

我想将类别及其子类别保存到数据库中,并且每个类别都具有多个子类别。请您帮我保存与category.Models.py,Serializers.py,Views对应的用户,类别和多个子类别。 py和传入请求已附加。

Models.py

class SavingCategoryandPreferences(models.Model):

   user = models.ForeignKey(User, related_name='user')
   news_category = models.ForeignKey(NewsCategory)
   subcategories= models.ManyToManyField(NewsSubCategory, related_name='sub')
   sort_order = models.IntegerField(default=0)
   slug = AutoSlugField(populate_from='subcategories_id', separator='', editable=True)
   created_time = models.DateTimeField("Created Date", auto_now_add=True)

Serializers.py

class MobilecatsubSerializer(serializers.ModelSerializer):
  class Meta:
    model = SavingCategoryandPreferences
    fields = ('id', 'user', 'subcategories', 'news_category',)

Views.py

class MobileCatsubViewswt(viewsets.ModelViewSet):
  serializer_class = serializers.MobilecatsubSerializer
  queryset = SavingCategoryandPreferences.objects.all()

传入请求

{
 "user":"39",
 "news_category":"22",
 "subcategories": [
    {"sub_id":"1"},
    {"sub_id":"2"}
  ]
}
python django django-rest-framework django-views django-serializer
1个回答
0
投票
隐式创建一个ManyRelatedField的实例,原始字段(在这种情况下为PrimaryKeyRelatedField)保留为[C0 ]实例属性,它依次在child_relationto_internal_value方法中用于对作为字段的列表元素传入的每个传入项(在这种情况下为主键)进行实际验证。

上面说的很长,只能在列表中传递相关ManyRelatedField实例的主键,例如:

NewsSubCategory

您甚至可以将主键作为字符串传递。

现在,如果您无法控制如何以及以何种格式传递数据,则可以覆盖{ "user":"39", "news_category":"22", "subcategories": [1, 2] } to_internal_value方法以从输入数据中提取主键并更新输入数据[C0与他们一起使用,例如:


MobilecatsubSerializer

[如果您过分雄心勃勃,可以继续操作,而改写dictclass MobilecatsubSerializer(serializers.ModelSerializer):

    class Meta:
        model = SavingCategoryandPreferences
        fields = ('id', 'user', 'subcategories', 'news_category',)

    def to_internal_value(self, data):
        if 'subcategories' in data:
            # Change this if needed
            spams = [dct['sub_id'] for dct in data['subcategories']]
            data.update(subcategories=subcategories)
        return super().to_internal_value(data)
方法(或您在该字段中使用的任何方法)以在那里进行值的序列化,但这是一个坏主意,因为具有to_internal_value的所有其他串行器也需要进行此操作。但是,如果出于某种原因,您希望遵循此路径,则最好继承PrimaryKeyRelatedField的子类,像我上面所做的那样进行覆盖PrimaryKeyRelatedField的序列化,并将其明确设置为PrimaryKeyRelatedField字段的序列化器。 
© www.soinside.com 2019 - 2024. All rights reserved.