Как использовать функцию инициализации для корзины в Django? - PullRequest
0 голосов
/ 18 апреля 2020

Я изучаю Django и пытаюсь создать корзину, которую покупатель может получить, добавить и добавить в строку заказа, после чего заказ будет отправлен. поэтому мой учитель сказал использовать def initiate (customer), и я не понимаю, как его использовать. Может кто-нибудь, пожалуйста, объясните мне это? Спасибо. вот код, над которым я работаю:

User = get_user_model()

class Customer(models.Model):
    user = models.OneToOneField(User, on_delete=Product, related_name="User")
    phone = models.CharField(max_length=20)
    address = models.TextField()
    balance = models.IntegerField(default=20000)

    def deposit(self, amount):
        self.balance += amount
        self.save()

    def spend(self, amount):
        if amount > self.balance:
            raise ValueError
        self.balance -= amount
        self.save()


class OrderRow(models.Model):
    product = models.ManyToManyField(Product)
    order = models.ForeignKey('Order', on_delete=models.CASCADE)
    amount = models.IntegerField()


class Order(models.Model):
    # Status values. DO NOT EDIT
    STATUS_SHOPPING = 1
    STATUS_SUBMITTED = 2
    STATUS_CANCELED = 3
    STATUS_SENT = 4



    customer = models.ForeignKey('Customer', on_delete=models.SET_NULL)
    order_time = models.DateTimeField(auto_now=True)
    total_price = Sum(F('amount') * F('product__price'))
    status = models.IntegerField(choices=status_choices)

    @staticmethod
    def initiate(customer):
        Order.initiate(User)

    def add_product(self, product, amount):
        Order.status = 1
        OrderRow.product = Product.objects.get(id=product.id)
        print(product.id)
        if OrderRow.objects.filter(product=product).exists():
            preexisting_order = OrderRow.objects.get(product=product, order=self)
            preexisting_order.amount += 1
            preexisting_order.save()
        else:
            new_order = OrderRow.objects.create(
                product=product,
                cart=self,
                amount=1,

            )
            new_order.save()

1 Ответ

0 голосов
/ 18 апреля 2020

Возможно, вы должны создать новый ордер, связанный с этим customer. Что-то вроде следующего:

@classmethod
def initiate(cls, customer):
    return cls.objects.create(customer=customer, status=cls.STATUS_SHOPPING)

Есть и другие проблемы с вашим кодом. Вы не можете использовать SET_NULL, если fk не имеет значения nullable:

customer = models.ForeignKey('Customer', on_delete=models.SET_NULL, null=true)

В строке не должно быть несколько продуктов:

class OrderRow(models.Model):
    product = models.ForeignKey(Product)  # not many2many!
    # ...

Кроме того, ваш add_product нуждается в некотором исправлении :

def add_product(self, product, amount):
    self.status = self.STATUS_SHOPPING  # the instance is self + use your descriptive variables
    print(product.id)
    # filter only rows in the current order!
    if self.orderrow_set.filter(product=product).exists():
        # fix naming: this is a row, not an order
        preexisting_order_row = self.orderrow_set.get(product=product)
        preexisting_order_row.amount += amount  # why +1, you are adding amount
        preexisting_order_row.save()
    else:
        new_order_row = OrderRow.objects.create(
            product=product,
            order=self,
            amount=amount,
        )  # create saves already
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...