Как создать строку в модели на основе данных, полученных из JSON-запроса от стороннего краулинга с помощью "лучшей практики"
опишите проблему:
I want to crawl data from dataforseo , and save them directly in model database through model.create() method with having multi model with multi relation with models so for instance in model A have
ManyToMany relation with model B
ManyToMany relation with model C
ManyToMany relation with model D
and model B have relation with model C
Так что мой вопрос заключается в том, как сохранить ответ JSON для всех моделей, упомянутых выше, гладко через модель A create Method
.Код:
view.py file
@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})
models.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)
любая помощь будет признательна
Вы можете переопределить метод create, сделав следующее в вашем файле 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)
и в вашем views.py в функции crawl вы можете просто просмотреть ваш 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})