如何根据“最佳实践”从第三方抓取的 JSON 请求中获取的数据在模型中创建行

威廉·塔杰

描述问题:

我想从dataforseomodel.create()爬取数据,并通过具有多模型与模型的多关系的方法将它们直接保存在模型数据库中,例如在模型A

  1. 与模型B的多对多关系

  2. 与模型C的多对多关系

  3. 与模型D的多对多关系

    和模型B与模型C有关系

所以我的问题是如何通过模型A创建方法顺利保存对上述所有模型的JSON响应

响应来自请求:

[
   {
      "title":"title",
      "url":"url",
      "description":"description",
      "pre_snippet":"pre_snippet",
      "extended_snippet":"extended_snippet",
      "images":"images",
      "amp_version":"amp_version",
      "rating":{
         "rating_type":"rating_type",
         "value":"value",
         "votes_count":"votes_count",
         "rating_max":"rating_max"
      },
      "price":{
         "current":"current",
         "regular":"regular",
         "max_value":"max_value"
      },
      "highlighted":{
         "name_highlighted":"name_highlighted"
      }
   },
   {
      "title":"title",
      "url":"url",
      "description":"description",
      "pre_snippet":"pre_snippet",
      "extended_snippet":"extended_snippet",
      "images":"images",
      "amp_version":"amp_version",
      "rating":{
         "rating_type":"rating_type",
         "value":"value",
         "votes_count":"votes_count",
         "rating_max":"rating_max"
      },
      "price":{
         "current":"current",
         "regular":"regular",
         "max_value":"max_value"
      },
      "highlighted":{
         "name_highlighted":"name_highlighted"
      }
   }
]

代码:

查看.py 文件

@api_view(['POST'])
@parser_classes((JSONParser,))
def crawl_data(request):
    """
    A view that can accept POST requests with JSON content.
    """
    Product.create(
         title=request.data[title]
         url=request.data[url]
         describtion=request.data[describtion]
         ...
         )
    return Response({'received data': request.data})

模型.py



class Highlighted(models.Model):
    name_highlighted = models.CharField(max_length=100)

    def __str__(self):
        return str(self.name_highlighted)


class Rating(models.Model):
    rating_type = models.CharField(max_length=500, null=True, blank=True)  # make unique
    value = models.CharField(max_length=500, null=True, blank=True)
    votes_count = models.CharField(max_length=500, null=True, blank=True)
    rating_max = models.CharField(max_length=500, null=True, blank=True)

    def __str__(self):
        return str(self.value)


class Price(models.Model):
    current = models.CharField(max_length=500, null=True, blank=True, default="none")
    regular = models.CharField(max_length=500, null=True, blank=True)
    max_value = models.CharField(max_length=500, null=True, blank=True)

    def __str__(self):
        return str(self.current)


class Product(models.Model):
    title = models.CharField(max_length=500, null=True, blank=True)
    url = models.CharField(max_length=500, null=True, blank=True)
    description = models.CharField(max_length=500, null=True, blank=True)
    pre_snippet = models.CharField(max_length=500, null=True, blank=True)
    extended_snippet = models.CharField(max_length=500, null=True, blank=True)
    images = models.CharField(max_length=500, null=True, blank=True)
    amp_version = models.CharField(max_length=500, null=True, blank=True)
    rating = models.ManyToManyField(Rating, null=True, blank=True)
    price = models.ManyToManyField(Price, null=True, blank=True)
    highlighted = models.ManyToManyField(Highlighted)

    def __str__(self):
        return str(self.url)

 

任何帮助感谢它

艾哈迈德·阿克尔·奥马尔

您可以通过在您的 models.py 文件中执行以下操作来覆盖 create 方法:

试试这个:

在产品模型中,您可以像这样覆盖创建模型


class Product(models.Model):
    title = models.CharField(max_length=500, null=True, blank=True)
    url = models.CharField(max_length=500, null=True, blank=True)
    description = models.CharField(max_length=500, null=True, blank=True)
    pre_snippet = models.CharField(max_length=500, null=True, blank=True)
    extended_snippet = models.CharField(max_length=500, null=True, blank=True)
    images = models.CharField(max_length=500, null=True, blank=True)
    amp_version = models.CharField(max_length=500, null=True, blank=True)
    rating = models.ManyToManyField(Rating, null=True, blank=True)
    price = models.ManyToManyField(Price, null=True, blank=True)
    highlighted = models.ManyToManyField(Highlighted)
    extended_people_also_search = models.ManyToManyField(ExtendedPeopleAlsoSearch)

    def __str__(self):
        return str(self.url)

    @classmethod
    def create(cls, **kwargs):
        product = cls.objects.create(
            title=kwargs['title'],
            url=kwargs['url'],
            description=kwargs['description'],
            pre_snippet=kwargs['pre_snippet'],
            extended_snippet=kwargs['extended_snippet'],
            images=kwargs['images'],
            amp_version=kwargs['amp_version'],

        )

        # add price dict

        price, created = Price.objects.get_or_create(current=kwargs['price']["current"],
                                                     regular=kwargs['price']["regular"],
                                                     max_value=kwargs['price']["max_value"],
                                                     )
        product.price.add(price)

        # add rating dict
        rating, created = Rating.objects.get_or_create(rating_type=kwargs['rating']["rating_type"],
                                                       value=kwargs['rating']["value"],
                                                       votes_count=kwargs['rating']["votes_count"],
                                                       rating_max=kwargs['rating']["rating_max"],
                                                       )
        product.rating.add(rating)

        return product

    def __str__(self):
        return str(self.url)

在函数 crawl 中的 views.py 中,您可以遍历 JSON 响应并将它们添加到您的模型中,如下所示:

@api_view(['POST'])
@parser_classes((JSONParser,))
def crawl_data(request):
    """
    A view that can accept POST requests with JSON content.
    """
    for product_data in request.data:
        product = Product.create(**product_data)
    # DO SOMETHING WITH product
    return Response({'received data': request.data})

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Tomcat中的第三方库最佳实践

无法检索第三方json数据

如何告诉Json.NET忽略第三方对象中的属性?

在Java程序中包含第三方jar文件的最佳实践是什么?

没有第三方解析器的情况下,如何在Kotlin中解析JSON?

如何在Google Chrome控制台中访问由第三方API检索的JSON数据?

不使用第三方库的PHP中的JWT(JSON Web令牌)。怎么签?

如何从第三方API保存JSON对象

在不向第三方提供数据的情况下查看/解析JSON的方法?

在TypeScript中,如何修改第三方界面?

如何为第三方网站创建 API?

如何在没有任何第三方库的情况下在Swift 3.0中使用Alamofire解析JSON

UI5 中是否有一种方法可以在不使用第三方工具的情况下根据 JSON 模式验证 JSON 数据?

如何从Django中的第三方网站获取我的网站的数据

Scala和第三方Java库中Akka的最佳做法

在AngularJs中扩展第三方库的最佳方法

将第三方库安装到托管Maven存储库中的最佳做法?

如何在 django 第三方应用程序中覆盖模型?

使用AWS消耗大量第三方API数据的最佳策略?

获取Java中的第三方库版本

如何在angular 6中捕获第三方库中的数据?

根据第三方捆绑中的配置将服务用于服务

如何在Firefox中为第三方Cookie创建例外?

如何使用.NET解析此第三方JSON服务?

在 WooCommerce 中下订单后,根据订单元数据向第三方发送邮件

如何在Dragal 8中使用Packosist上未安装的第三方库安装第三方库?

如何从第三方REST API获取数据并在页面上显示

如何从Android中的JSON请求获取数据?

如何在Xcode中的调用堆栈中隐藏第三方调用