Как клонировать экземпляр модели без клонирования отношения базы данных? - PullRequest
0 голосов
/ 14 июля 2020

Я создаю модель тележки со следующим кодом.

from django.db import models

class Item(models.Model):
    name = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=8, decimal_places=2)

    def __str__(self):
        return self.name

class Order(models.Model):
    date = models.DateTimeField(auto_now_add=True)
    transcation_id = models.CharField(max_length=200, null=True)

    def __str__(self):
        return str(self.date)

class OrderItem(models.Model):
    item = models.ForeignKey(Item, on_delete=models.CASCADE, blank=True, null=True)
    order = models.ForeignKey(Order, on_delete=models.CASCADE, blank=True, null=True)
    quantity = models.IntegerField(default=0, blank=True, null=True)

Связь «многие к одному» между Item и Order позволяет одному Order содержать множество Item и это выглядит нормально.

Экземпляр модели можно просто клонировать, как уже был дан ответ в этом вопросе .

Моя проблема в том, что price из Item изменено. Цена содержащихся в Заказе товаров также изменится. Но я не хочу его менять. В случае, если покупатель уже совершил покупку, цена не может быть изменена. Есть ли способ клонировать экземпляр Order, который полностью не связан с другой моделью?

1 Ответ

0 голосов
/ 14 июля 2020

Сохранить цену вручную

class OrderItem(models.Model):
    item = models.ForeignKey(Item, on_delete=models.CASCADE, blank=True, null=True)
    order = models.ForeignKey(Order, on_delete=models.CASCADE, blank=True, null=True)
    quantity = models.IntegerField(default=0, blank=True, null=True)
    price = price = models.DecimalField(max_digits=8, decimal_places=2, null=True, default=None)
    def save():
        if self.pk == None:
            self.price = self.item.price
            super(OrderItem, self).save()
...