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

我要将类别及其子类别保存到数据库中,并且每个类别都具有多个子类别。请您帮我保存与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"}
  ]
}
o0wuchen0o 回答:如何通过使用models.py,serializers.py和views.py将解析的json数组值保存到Django python rest api中的数据库

默认情况下,DRF serializers.ModelSerializer将所有相关字段定义为PrimaryKeyRelatedField。对于一对多关系(many=True),即反向FK或多对多关系,它隐式使用原始字段(ManyRelatedField创建一个PrimaryKeyRelatedField的实例。在这种情况下)保留为child_relation实例属性,而该属性又在to_internal_value的{​​{1}}方法中用于对传入的每个传入项(在这种情况下为主键)进行实际验证作为该字段的列表元素。

以上是长话,您只能在列表中传递相关ManyRelatedField实例的主键,例如:

NewsSubCategory

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


现在,如果您无法控制数据的传递方式和传递方式,则可以覆盖{ "user":"39","news_category":"22","subcategories": [1,2] } 的{​​{1}}方法来从输入数据中提取主键并进行更新输入数据to_internal_value,例如:

MobilecatsubSerializer

如果您过于野心勃勃,则可以继续操作,而改写dict的{​​{1}}方法(或您在该字段中使用的任何方法)以在那里进行值的序列化,但这会这是一个坏主意,因为其他所有具有class 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的序列化,并将其明确设置为{ {1}}字段。

本文链接:https://www.f2er.com/3103504.html

大家都在问