当前位置: 首页 > 知识库问答 >
问题:

使用Django REST框架序列化程序将JSON请求保存到数据库

许丁雷
2023-03-14

我对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/

你能指出问题所在,并给出解决方法吗?

共有2个答案

葛修真
2023-03-14

好的,可能存在验证错误。

模型中需要描述,您传递的是空的。

      try:
            if news_serializer.is_valid():
                news_serializer.save()
                return Response("Created successfully", status=status.HTTP_201_CREATED)
           else: 
              print(news_serializer.errors)
              return Response('Invalid data') # whatever you want

阅读https://www.django-rest-framework.org/api-guide/validators/#validation-in-rest-framework

姜阳
2023-03-14

让我来帮你解决这个问题。

在当前状态下,解决方案是重写NewsSerializer的create方法来创建新闻和关键字实例。

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

此外,我将更新视图的post方法,如下所示:

...
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)
...
 类似资料:
  • 我想我会在这里问这个问题,因为我不太确定我会错在哪里。我正在尝试使用Django Rest框架类通过AJAX执行POST请求。但是,每当事件触发时,我都会收到以下错误: 这是堆栈跟踪中显示的内容: 上下文 我试图做到这一点,当用户单击“添加到列表”按钮时,它会向用户定义的列表发送一个cafeName(以及最终的其他详细信息)。 我想知道是否有人可以看看我的代码,并给我一些指导,我哪里出了问题? 代

  • 问题内容: 我正在使用Ef 4.1,并且有一个POCO对象要序列化为JSON,我已经读到在使用延迟加载时这样做有问题,但是我不确定我可以这样做,因为一个可以的集合。 有什么办法吗?将这种对象序列化为JSON? 我的对象看起来像: 问题答案: 问题是循环引用。避免这种情况的一种简单方法是使用Json.Net http://james.newtonking.com/projects/json- net

  • 问题内容: 似乎无法使用WCF的本机DataContractJsonSerializer或ASP.NET的本机JavaScript序列化器将Entity Framework对象序列化为JSON。这是由于两个串行器都拒绝的引用计数问题。我还尝试了Json.NET,它在引用计数问题上也特别失败。 编辑: Json.NET现在可以序列化和反序列化Entity Framework实体 。 我的对象是Ent

  • 我们使用Google GSON反序列化JSON数据到Java对象。请参阅下面的示例JSON数据和相应的POJO类。我能够反序列化“name”和“phoneNumber”字段。但对于“Departments”字段,我看到NULL。您能帮助我如何反序列化“Departments”字段吗? 我的JSON: 类: customerDeserializer.java:

  • 我正在从事一个SpringMVC项目,我需要完成的任务之一是让用户在POST请求中发送一个JSON数据字符串。我知道Spring将使用Jackson对对象反序列化JSON,但如果我尝试以下方法: 我只是返回HTTP 400错误请求(“客户端发送的请求在语法上不正确”)。 如何获取客户端作为字符串发送的原始JSON?