Создание объекта для модели django
создана модель для заказов и модель для элементов заказа. когда мы создаем заказ через представление, почему 'user_id', когда имя поля в модели просто 'user'
models.py
class Order(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="order_user")
views.py
order = Order.objects.create(
user_id=user_id,
Подобное произошло с orderitems
models.py
class OrderItem(models.Model):
order = models.ForeignKey(Order, related_name="items", on_delete=models.CASCADE)
views.py
for item in basket:
OrderItem.objects.create(order_id=order_id, product=item["product"], price=item["price"], quantity=item["qty"])
полный код order/models.py
from decimal import Decimal
from django.conf import settings
from django.db import models
from store.models import Product
class Order(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="order_user")
full_name = models.CharField(max_length=50)
email = models.EmailField(max_length=254, blank=True)
address1 = models.CharField(max_length=250)
address2 = models.CharField(max_length=250)
city = models.CharField(max_length=100)
phone = models.CharField(max_length=100)
postal_code = models.CharField(max_length=20)
country_code = models.CharField(max_length=4, blank=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
total_paid = models.DecimalField(max_digits=5, decimal_places=2)
order_key = models.CharField(max_length=200)
payment_option = models.CharField(max_length=200, blank=True)
billing_status = models.BooleanField(default=False)
class Meta:
ordering = ("-created",)
def __str__(self):
return str(self.created)
class OrderItem(models.Model):
order = models.ForeignKey(Order, related_name="items", on_delete=models.CASCADE)
product = models.ForeignKey(Product, related_name="order_items", on_delete=models.CASCADE)
price = models.DecimalField(max_digits=5, decimal_places=2)
quantity = models.PositiveIntegerField(default=1)
def __str__(self):
return str(self.id)
checkout/views.py
def payment_complete(request):
PPClient = PayPalClient()
body = json.loads(request.body)
data = body["orderID"]
user_id = request.user.id
requestorder = OrdersGetRequest(data)
response = PPClient.client.execute(requestorder)
total_paid = response.result.purchase_units[0].amount.value
basket = Basket(request)
order = Order.objects.create(
user_id=user_id,
full_name=response.result.purchase_units[0].shipping.name.full_name,
email=response.result.payer.email_address,
address1=response.result.purchase_units[0].shipping.address.address_line_1,
address2=response.result.purchase_units[0].shipping.address.admin_area_2,
postal_code=response.result.purchase_units[0].shipping.address.postal_code,
country_code=response.result.purchase_units[0].shipping.address.country_code,
total_paid=response.result.purchase_units[0].amount.value,
order_key=response.result.id,
payment_option="paypal",
billing_status=True,
)
order_id = order.pk
for item in basket:
OrderItem.objects.create(order_id=order_id, product=item["product"], price=item["price"], quantity=item["qty"])
return JsonResponse("Payment completed!", safe=False)
Суффикс _id
- это "магия" Django. Как при использовании методов queryset, таких как .filter()
, так и при определении реляционного поля модели, вы можете выбирать между
foo_field = foo_instance
и
foo_field_id = foo_id #its primary key value, normally an integer.
Последняя избавляет от необходимости выполнять запрос к БД для получения экземпляра какой-то другой модели только для того, чтобы определить отношение или отфильтровать объекты, которые с ним связаны. Но это означает, что вы должны иметь высокую степень доверия к своему instance_id
числовому значению.