json - 使用 Django REST 框架序列化程序将 JSON 请求保存到数据库
问题描述
我对 Django 完全陌生,出于某种原因,我不得不直接跳到 Django REST 框架。我想将作为 POST 请求发送的 JSON 对象保存在我的数据库中。JSON 对象如下所示:
[{
"title": "Bitcoin Price Likely to Reach $50K Soon According to This Indicator",
"description": "",
"date": "2021-02-09T09:08:58Z",
"link": "https://cryptopotato.com/bitcoin-price-likely-to-reach-50k-soon-according-to-this-indicator/",
"keywords": [{
"name": "bitcoin"
}],
"source": "https://cryptocompare.com"
},
{
"title": "Post-Tesla News FOMO Helps Bitcoin Price to Surge Above $48,000",
"description": "",
"date": "2021-02-09T09:08:58Z",
"link": "https://www.cryptoglobe.com/latest/2021/02/post-tesla-news-fomo-helps-bitcoin-price-to-surge-above-48000/",
"keywords": [{
"name": "bitcoin"
}],
"source": "https://cryptocompare.com"
}]
我创建了这样的模型:
class Keywords(models.Model):
name = models.CharField(max_length=20)
def __str__(self):
return self.name
class News(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
date = models.DateTimeField()
link = models.URLField()
keywords = models.ManyToManyField(Keywords)
source = models.CharField(max_length=30)
class Meta:
db_table = "News"
# ordering = "-date"
def __str__(self):
return self.title
序列化器:
class KeywordSerializer(serializers.ModelSerializer):
class Meta:
model = Keywords
fields = ["name"]
class NewsSerializer(serializers.ModelSerializer):
keywords = KeywordSerializer(read_only=True, many=True)
class Meta:
model = News
fields = ["title", "description", "date", "link", "keywords", "source"]
最后是我的观点:
class NewsView(APIView):
def post(self, request):
news_serializer = NewsSerializer(data=request.data, many=True)
try:
if news_serializer.is_valid():
news_serializer.save()
return Response("Created successfully", status=status.HTTP_201_CREATED)
except Exception as e:
print(e)
return Response("Error, Don't know what", status=status.HTTP_400_BAD_REQUEST)
通常我尽量不发布模糊和一般的问题,但在这个问题中,我完全不知道如何在这里调试和找到问题。我从终端得到的唯一东西是
Bad Request: /news/
您能否指出问题所在,并提供解决方法?
解决方案
让我帮助您解决这个问题。
在当前状态下,解决方案将是重写创建新闻和关键字实例的create
方法。NewsSerializer
class NewsSerializer(serializers.ModelSerializer):
...
def create(self, validated_data):
keywords = validated_data.pop("keywords", None)
news, _ = News.objects.get_or_create(**validated_data)
if news:
for keyword in keywords:
keyword, _ = Keywords.objects.get_or_create(**keyword)
news.keywords.add(key)
return news
另外我会更新视图的发布方法如下:
...
def post(self, request):
for news in request.data:
serializer = NewsSerializer(news)
serializer.save(raise_exception=True)
return Response("Created successfully", status=status.HTTP_201_CREATED)
...
推荐阅读
- reactjs - 如何在 CDatatable 中设置 ScrollX (Reactjs, core-ui)
- python - 将数据导出到特定的 CSV 单元 python
- python - 如何比较 Python 中预定义集群的整体相似性?
- ios - xCode Cocoapods 构建失败“架构 x86_64 的未定义符号”
- python - 如何检查 Tensorflow Lite Tensor 是否具有动态或静态大小,HasDynamicTensorImpl 呢
- c# - ASP.NET Core MVC 自定义验证被忽略
- reactjs - React 组件失去对每次击键的关注
- javascript - 从 JS 中的复杂对象中获取子集
- python - 我无法在 Django 中发送带有附件的表单
- tensorflow - TPU Tensorflow 训练:重新加载模型以恢复训练在 TPU 上失败,但在 GPU 上失败