描述问题:
我想从dataforseomodel.create()
爬取数据,并通过具有多模型与模型的多关系的方法将它们直接保存在模型数据库中,例如在模型A中
与模型B的多对多关系
与模型C的多对多关系
与模型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] 删除。
我来说两句