Django: Как создать отдельные экземпляры одного и того же объекта модели?

У меня есть два класса, которые должны быть связаны друг с другом. класс Item и класс Order.

Объект Item имеет несколько атрибутов: название, стоимость, количество и т.д. Я хочу, чтобы один и тот же предмет мог принадлежать нескольким различным объектам заказа и при этом иметь различные атрибуты внутри этого объекта заказа. (Например, разные заказы могут иметь разные количества одного и того же предмета в заказе)

Возможно ли это?

Вот что у меня есть на данный момент:

class Item(models.Model):
    description = models.CharField(max_length=200)
    cost = models.FloatField()
    order_quantity = models.IntegerField(null=True, blank=True)

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

    @property
    def line_total(self):
        return self.cost * self.order_quantity


class Order(models.Model):
    STATUS_CHOICES = (
        ('draft', 'Draft'),
        ('issued', 'Issued'),
        ('closed', 'Closed'),
    )
    reference = models.AutoField(primary_key=True)
    location = models.ForeignKey(
    Location, null=True, blank=True, on_delete=models.CASCADE)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    status = models.CharField(max_length=10,
                          choices=STATUS_CHOICES,
                          default='draft')
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    item = models.ManyToManyField(Item, blank=True)

    class Meta:
        ordering = ('location',)

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

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

Ок, благодаря Крису в комментариях я достиг решения, которое, кажется, работает так, как я хочу.

Я добавил третий класс

class Membership(models.Model):
    item = models.ForeignKey(Item, null=True, blank=True, on_delete=models.CASCADE)
    order = models.ForeignKey(
    Order, null=True, blank=True, on_delete=models.CASCADE)
    cost = models.FloatField()
    order_quantity = models.IntegerField(null=True, blank=True)

    @property 
    def line_total(self): <-----removed from Item class, pasted here
        return self.cost * self.order_quantity

Я изменил свой класс Item так, чтобы он содержал только атрибуты, которые не должны меняться

class Item(models.Model):
    description = models.CharField(max_length=200)

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

добавлена переменная item_in_order к моему представлению:

def order(request, pk):
    order = Order.objects.filter(reference=pk)
    items = Item.objects.filter(order=pk)
    item_in_order = Membership.objects.filter(order=pk)

    context = {'order': order, 'items': items,
           'item_in_order': item_in_order}
    return render(request, 'orderingapp/order.html', context)

и на шаблоне:

<tbody>
    {% for item in item_in_order %}
    <tr>
        <td>{{item.item.description |title}}</td>
        <td>£{{item.cost |floatformat:2}}</td>
        <td>{{item.order_quantity |floatformat:0}}</td>
        <td>£{{item.line_total}}</td>
    </tr>
    {% endfor %} {% else %}
    <p>Nothing here</p>
    {% endif %}
</tbody>
Back to Top