Как я могу соединить различные экземпляры классов на основе их идентификаторов?

У меня есть два следующих класса:

class Position(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField()
    price = models.FloatField(blank=True)
    created = models.DateTimeField(blank=True)

    def save(self, *args, **kwargs):
        self.price = self.product.price * self.quantity
        return super().save(*args, **kwargs)

    def __str__(self):
        return f"id: {self.id}, product: {self.product.name}, quantity: {self.quantity}"


class Sale(models.Model):
    transaction_id = models.CharField(max_length=12, blank=True)
    positions = models.ManyToManyField(Position)
    total_price = models.FloatField(blank=True, null=True)
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    salesman = models.ForeignKey(Profile, on_delete=models.CASCADE)
    created = models.DateTimeField(blank=True)
    updated = models.DateTimeField(auto_now=True)


    def __str__(self):
        return f"Total sales price: ${self.total_price}"

    def get_absolute_url(self):
        return reverse('sales:detail', kwargs={'pk': self.pk})

    def save(self, *args, **kwargs):
        if self.transaction_id == '':
            self.transaction_id = generate_code()
        if self.created is None:
            self.created = timezone.now()
        return super().save(*args, **kwargs)
    
    def get_position(self):
        return self.positions.all()

Как я могу связать каждый экземпляр позиции с соответствующим экземпляром продажи?

Я пробовал реализовать этот метод:

def get_sales_id(self):
        sale_obj = self.sale_set.first()
        return sale_obj.id

но в этом случае я всегда буду получать первый id вхождения определенной позиции.

Exaple: pos1: id 1, продукт, количество, цена ... pos2: id 2, продукт, количество, цена ...

продажа1: позиция 1, позиция 2 ... sale2: pos 1, pos3 ...

Когда я пытаюсь объединить их, основываясь на идентификаторе продажи, я получаю:

pos1: id 1, ... , sale_id 1 pos1: id 1, ... , sale_id 1 <= когда должно быть 2!

Я пытался настроить этот фильтр, но я просто не могу понять, как заставить его работать:

def get_id(self):
        related_sale_obj = Sale.objects.filter(positions = self)
        
        #related_id = related_obj.id
        #sales_id_prefetched = self.sale_set.only('Position').explain()
        return related_sale_obj

Если у вас есть идеи, как я могу это исправить, буду очень признателен. Хорошего дня

Вернуться на верх