Как сохранить данные из API в мою базу данных MySQL в проекте Django REST

У меня есть проект Django REST. Есть модель Product. Я получаю некоторые данные из API marketplace о запасах товаров. И мне нужно сохранить их в моей базе данных. Я не знаю, какой вид набора представлений выбрать. И как сделать метод create. Спасибо.

Моя модель продукта `

class Product(models.Model):
    store = models.ForeignKey(
        Store,
        on_delete=models.PROTECT, blank=True,
                            verbose_name="Store")
    offer_id = models.CharField(max_length=50,
                            blank=True,
                            default="",
                            verbose_name="SKU")
    name = models.CharField(max_length=128,
                            blank=True,
                            default="",
                            verbose_name="Name")
    present = models.PositiveIntegerField(
                            default=0,
                            verbose_name="Present")
    reserved = models.PositiveIntegerField(
                            default=0,
                            verbose_name="Reserved")

` Мой сериализатор

class ProductSerializer(serializers.ModelSerializer):

    class Meta:
        model = Product
        fields = '__all__'

    store = serializers.CharField()
    offer_id = serializers.CharField()
    name = serializers.CharField()
    present = serializers.IntegerField()
    reserved = serializers.IntegerField()

Данные, которые я получаю от API, представляют собой список, например:

[
   {
      "offer_id":"1-100-3-0",
      "present":5,
      "reserved":1
   },
   {
      "offer_id":"1-101-3-9",
      "present":0,
      "reserved":0
   }
]

Обратитесь к документации для получения дополнительной информации

вот как вы это делаете

@api_view([ 'POST'])
def product_post(request):
    if request.method == 'POST':
       serializer = ProductSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

и урлы должны быть

path('product_post/', views.product_post, name='product_post'),

Я создаю Modelviewset, он работает без ошибок, но акции не сохраняются в БД. Я попытался создать и запустить тест, но у меня

self.assertEqual(len(Product.objects.filter(store__user_id=self.user.pk)), 1)

AssertionError: 0 != 1

Так что я не могу найти причину.

class ProductApi(ModelViewSet):

serializer_class = ProductSerializer
permission_classes = (IsAuthenticated,)

def get_queryset(self):
    return Product.objects.filter(
        store__user_id=self.request.user.pk)\
        .order_by('-offer_id')

def create(self, request, *args, **kwargs):
    st = Store.objects.filter(user=self.request.user,
                              type=1)
    for _ in st:
        api = Parser(api_key=_.api_key,
                            client_id=_.client_id)
        data = api.get_product_info_stocks()
        if len(data) > 0:
            for stock in data:
                if Product.objects.filter(
                                offer_id=stock.get('offer_id')).exists():
                    pass
                else:
                    stock_data = {
                        'offer_id': stock['offer_id'],
                        'present': stock['present'],
                        'reserved': stock['reserved']
                    }
                    Product.objects.create(**stock_data)
            stocks = Product.objects.filter(
                store__in=st).order_by(
                '-offer_id')
            s = ProductSerializer(stocks, many=True)
            return Response(status=200, data=s.data)
        else:
            return Response(status=204,
                            data={"Info": "Empty response"})
    return Response(status=400,
                    data={"Message": "User has no stores"})
Вернуться на верх