我想将类别及其子类别保存到数据库中,并且每个类别都具有多个子类别。请您帮我保存与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"}
]
}
ManyRelatedField
的实例,原始字段(在这种情况下为PrimaryKeyRelatedField
)保留为[C0 ]实例属性,它依次在child_relation
的to_internal_value
方法中用于对作为字段的列表元素传入的每个传入项(在这种情况下为主键)进行实际验证。上面说的很长,只能在列表中传递相关ManyRelatedField
实例的主键,例如:
NewsSubCategory
您甚至可以将主键作为字符串传递。
现在,如果您无法控制如何以及以何种格式传递数据,则可以覆盖
{ "user":"39", "news_category":"22", "subcategories": [1, 2] }
的to_internal_value
方法以从输入数据中提取主键并更新输入数据[C0与他们一起使用,例如:MobilecatsubSerializer
[如果您过分雄心勃勃,可以继续操作,而改写dict
的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
的子类,像我上面所做的那样进行覆盖PrimaryKeyRelatedField
的序列化,并将其明确设置为PrimaryKeyRelatedField
字段的序列化器。