Django Serializer ничего не вставляет в базу данных (без ошибок)
Как я указал в заголовке, в мою базу данных ничего не вставляется, хотя другие поля вставляются. Моя цель состоит в том, чтобы принять json запрос на пост:
{
"user": "0",
"total_price":29.60,
"type":"PENDING",
"products": [{
"id_product":"0"
},{
"id_product":"1"
},
{
"id_product":"3"
}
]
}
Я беру этот пост-запрос и пропускаю его через свой сериализатор, чтобы сохранить его в своей базе данных. поле products в json - это "список внешних ключей, указывающих на первичный ключ в модели Products.
".My models.py
from django.db import models
# Create your models here.
class Users(models.Model):
user_id = models.CharField(max_length=10, primary_key=True, default="")
first_name = models.CharField(max_length=30,default="")
last_name = models.CharField(max_length=30,default="")
profile_image = models.ImageField(upload_to='users', default='./images/no-account-image.jpg')
email = models.CharField(max_length=50, unique=True,default="")
def __str__(self):
return self.user_id
class Products(models.Model):
CATEGORY = (
('SHIRT','Shirt'),
('PANTS','Pants'),
('SHORTS','Sorts'),
('JACKET', 'Jacket'),
('BEANIE', 'Beanie'),
('HOODIE', 'Hoodie'),
)
product_id = models.CharField(max_length=10, primary_key=True,default="")
name = models.CharField(max_length=10,default="")
cost = models.DecimalField(max_digits=6, decimal_places=2,default=0)
description = models.TextField(max_length=1000,default="")
category = models.CharField(max_length=10, choices=CATEGORY,default="")
image = models.ImageField(upload_to='products', default='./images/No_Image_avaliable.jpg')
products_remaining = models.IntegerField(default=0)
def __str__(self):
return self.product_id
class Transactions(models.Model):
TYPE = (
('SHIPPED','Shipped'),
('RETURNED','Returned'),
('PENDING', 'Pending'),
)
transaction_id = models.CharField(max_length=10, primary_key=True,default="")
user = models.ForeignKey(Users, on_delete=models.PROTECT,default="",related_name='user')
total_price = models.DecimalField(max_digits=6, decimal_places=2,default=0.0)
type = models.CharField(max_length=10, choices=TYPE,null=True,default="")
products = models.ManyToManyField(Products)
def __str__(self):
return self.transaction_id
my views.py
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from rest_framework.parsers import JSONParser
from django.http.response import JsonResponse
from main.models import Users,Products,Transactions
from main.serializers import UsersSerializer,TransactionsSerializer, ProductsSerializer
from django.core import serializers
from bson import ObjectId
import json
# Create your views here.
@csrf_exempt
def transactionsEndpoint(request):
if request.method=='GET':
transactions = Transactions.objects.get(product_id='0')
transactions_serializer = TransactionsSerializer(transactions,many=True)
return JsonResponse(transactions_serializer.data,safe=False)
elif request.method=='POST':
transactions_data=JSONParser().parse(request)
print(transactions_data)
transactions_serializer=TransactionsSerializer(data=transactions_data)
if transactions_serializer.is_valid():
transactions_serializer.save()
return JsonResponse("Added Successfully",safe=False)
print(transactions_serializer.errors)
return JsonResponse("Failed to Add",safe=False)
@csrf_exempt
def productsEndpoint(request):
if request.method=='GET':
products = Products.objects.filter(product_id__exact='1')
products_serializer = ProductsSerializer(products,many=True)
return JsonResponse(products_serializer.data,safe=False)
elif request.method=='POST':
products_data=JSONParser().parse(request)
products_serializer=ProductsSerializer(data=products_data)
if products_serializer.is_valid():
products_serializer.save()
return JsonResponse("Added Successfully",safe=False)
print(products_serializer.errors)
return JsonResponse("Failed to Add",safe=False)
@csrf_exempt
def usersEndpoint(request):
if request.method=='GET':
users = Users.objects.all()
users_serializer = UsersSerializer(users,many=True)
return JsonResponse(users_serializer.data,safe=False)
elif request.method=='POST':
users_data=JSONParser().parse(request)
users_serializer=UsersSerializer(data=users_data)
if users_serializer.is_valid():
users_serializer.save()
return JsonResponse("Added Successfully",safe=False)
return JsonResponse("Failed to Add",safe=False)
my serializers.py
from itertools import product
from rest_framework import serializers
from main.models import Users,Products,Transactions
class UsersSerializer(serializers.ModelSerializer):
class Meta:
model = Users
fields=['user_id','first_name','last_name','email']
class ProductsSerializer(serializers.ModelSerializer):
class Meta:
model = Products
fields=['product_id','cost','description','category','products_remaining']
class TransactionsSerializer(serializers.ModelSerializer):
user = serializers.PrimaryKeyRelatedField(queryset=Users.objects.all())
products = ProductsSerializer(many=True)
class Meta:
model = Transactions
fields=['user','total_price','type','products']
depth=1
def create(self, validated_data):
product_data = validated_data.pop('products')
transactions = Transactions.objects.create(**validated_data)
for product in product_data:
transactions.products.create(**product)
return transactions
mysql> SELECT * FROM main_transactions;
+----+-------------+---------+---------+
| id | total_price | type | user_id |
+----+-------------+---------+---------+
| 1 | 29.60 | PENDING | 0 |
| 2 | 29.60 | PENDING | 0 |
| 3 | 29.60 | PENDING | 0 |
+----+-------------+---------+---------+
Поскольку это отношения "многие ко многим" между продуктами и транзакциями, django создаст отдельную таблицу. Что-то вроде main_transactions_products?
Также, разве поля под продуктами в вашем json-файле не должны называться product_id, а не id_product?