Проблема с сохранением объекта в django-rest-framework
Вот мое представление, в котором я сохраняю объект Order со значениями из frontend:
@api_view(['POST'])
@permission_classes([AllowAny])
def generate_bank_transfer_order(request):
if request.method == "POST":
body = json.loads(request.body)
first_name = body.get("firstName")
last_name = body.get("lastName")
full_name = f"{first_name} {last_name}"
today = datetime.now()
transaction_id= f'00{today.strftime("%S%M%H%d%m%y")}'
code_base = body.get('code')
try:
code = Code.objects.get(code = code_base)
new_order = Order(email=body.get("email"), message=body.get("message"),
city=body.get("city"), adress=body.get("adress"), postal_code=body.get("postalCode"),
phone=body.get("phone"), full_name=full_name, product_names=body.get("cart"),
shipment_fee=body.get("shipmentFee"), shipment_method=body.get("shipmentMethod"),
transaction_id=transaction_id, total_price=body.get("price"), code=code)
new_order.save()
return JsonResponse({"success":new_order.transaction_id})
except ObjectDoesNotExist:
new_order = Order(email=body.get("email"), message=body.get("message"),
city=body.get("city"), adress=body.get("adress"), postal_code=body.get("postalCode"),
phone=body.get("phone"), full_name=full_name, product_names=body.get("cart"),
shipment_fee=body.get("shipmentFee"), shipment_method=body.get("shipmentMethod"),
transaction_id=transaction_id, total_price=body.get("price"))
new_order.save()
return JsonResponse({"success":new_order.transaction_id})
Это моя модель заказа:
class Order(models.Model):
user = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, blank=True, null=True)
message = models.TextField(max_length=1000, blank=True, null=True)
email = models.EmailField(max_length=255, blank=True, null=True)
city = models.CharField(max_length=75, default='')
adress = models.CharField(max_length=100)
postal_code = models.CharField(max_length=6)
phone = models.CharField(primary_key=True, max_length=9, validators=[RegexValidator(r'^\d{9}$/')])
full_name = models.CharField(max_length=100)
product_names = models.TextField(max_length=5000)
shipment_fee = models.IntegerField(default=0)
shipment_method = models.CharField(blank=True, null=True, max_length=50)
code = models.ForeignKey(Code, on_delete=models.SET_NULL, null=True)
transaction_id = models.CharField(max_length=150, default=0)
total_price = models.DecimalField(default=0, max_digits=12, decimal_places=2)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
accepted = models.BooleanField(default=False)
shipped = models.BooleanField(default=False)
def __str__(self):
return f"{self.email} : {self.transaction_id}"
def save(self):
if not self.created_at:
self.created_at = timezone.now()
self.updated_at = timezone.now()
return super(Order, self).save()
Этот кусок кода не идеален, но он сохраняет нужные мне данные. Проблема в том, что когда я хочу сохранить другой заказ, предыдущий заказ обновляется, а не создается следующий. Есть мысли о том, что я сделал не так?
Попробуйте передать аргументы методу сохранения, как описано в docs:
def save(self, *args, **kwargs):
if not self.created_at:
self.created_at = timezone.now()
self.updated_at = timezone.now()
super().save(*args, **kwargs)
Я бы также убрал попытки/get:
new_order = Order(email=body.get("email"), message=body.get("message"),
city=body.get("city"), adress=body.get("adress"), postal_code=body.get("postalCode"),
phone=body.get("phone"), full_name=full_name, product_names=body.get("cart"),
shipment_fee=body.get("shipmentFee"), shipment_method=body.get("shipmentMethod"),
transaction_id=transaction_id, total_price=body.get("price"))
try:
code = Code.objects.get(code=code_base)
new_order.code = code
except ObjectDoesNotExist:
pass
new_order.save()
return JsonResponse({"success":new_order.transaction_id})