gpt4 book ai didi

python - 如何使用 models.py 、 serializers.py 和 views.py 将解析的 json 数组值保存到 django python Rest api 中的数据库

转载 作者:太空宇宙 更新时间:2023-11-03 20:08:05 27 4
gpt4 key购买 nike

我想将类别及其子类别保存到数据库中,这里每个类别都有多个子类别。您能帮我保存与类别相对应的用户、类别和多个子类别吗?Models.py、Serializers.py、Views .py 并附加传入请求。

模型.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)

序列化器.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"}
]
}

最佳答案

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

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

{
"user":"39",
"news_category":"22",
"subcategories": [1, 2]
}

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

<小时/>

现在,如果您无法控制数据的传递方式和格式,您可以重写 MobilecatsubSerializerto_internal_value 方法来提取主键从输入数据中获取并用它们更新输入数据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)
<小时/>

如果您觉得过于雄心勃勃,您可以继续并覆盖 PrimaryKeyRelatedFieldto_internal_value 方法(或您用于该字段的任何内容)来执行序列化那里的值,但这将是一个坏主意,因为所有其他具有PrimaryKeyRelatedField的序列化器也需要不必要地经历这个过程。但是,如果出于某种原因,您想遵循这条路径,最好将 PrimaryKeyRelatedField 子类化,像我上面那样进行序列化覆盖 to_internal_value ,并显式设置此值作为 subcategories 字段的序列化程序。

关于python - 如何使用 models.py 、 serializers.py 和 views.py 将解析的 json 数组值保存到 django python Rest api 中的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58854468/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com