Reputation: 53
a model is created for orders and one for order items.when we create an order via the views why 'user_id' is when the field name in the model is just '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,
Similar happened with 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"])
full code 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)
Upvotes: 0
Views: 388
Reputation: 8222
The _id
suffix is Django "magic". Both when using queryset methods like .filter()
and when defining a model relational field, you can choose between
foo_field = foo_instance
and
foo_field_id = foo_id #its primary key value, normally an integer.
The latter saves a DB query to obtain an instance of some other model just in order to define a relation or to filter objects that are related to it. But it does mean that you have to have a high degree of trust in your instance_id
numerical value.
Upvotes: 1