Ограничение Django: разрешить одному полю иметь только одну комбинацию с другим полем и при этом разрешить исторические данные

Я пытаюсь создать ограничение для таблицы Offer, в которой есть offer_id (charfield) и product_id (foreign key), где offer_id может быть объединен только с одним продуктом. Не допускается, чтобы offer_id сочетался с несколькими продуктами.

Я не могу сделать offer_id просто уникальным, так как эта таблица использует исторические данные. Как я могу сделать ограничение для моей django Model, которое гарантирует, что каждый offer_id связан не более чем с одним продуктом, продукт может иметь несколько offer_id, а один offer_id может встречаться несколько раз из-за исторических данных.

Простой обзор модели предложения:

class Offer(models.Model):
    offer_id = models.CharField(max_length=45, default=-1)
    seller = models.ForeignKey(Seller, on_delete=models.CASCADE, null=True, blank=True)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    price = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    time = models.DateTimeField(default=timezone.now)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['offer_id'], condition=?, name='unique_offer_product')
        ]
        

    def __str__(self):
        return f"Product {self.product} with seller {self.seller} has offer_id {self.offer_id}"
Вернуться на верх