Как я могу создать внешний ключ, оставляющий шансы для разных моделей в поле TO?

#python #django #django-models #database-relations

#python #django #django-модели #отношения с базой данных

Вопрос:

У меня есть несколько моделей продуктов, как показано ниже

 class ProductBase(models.Model):
    name = models.CharField(max_length=50)
    
    class Meta:
        abstract = True

    def __str__(self):
        return self.name


class ProductOne(ProductBase):
    color = models.CharField(max_length=50)
 

class ProductTwo(ProductBase):
    type = models.CharField(max_length=50)


class ProductThree(ProductBase):
    breed = models.CharField(max_length=50)
  

Ожидается, что у каждого из этих продуктов будет image_set, поэтому я создал модель ниже для изображений продукта

 class Image(models.Model):
    product = models.ForeignKey(to=[HERE IS THE PROBLEM], on_delete=models.CASCADE)
    image = models.ImageField(upload_to='upload-path')
  

Как я могу заставить поле product в моем классе Image указывать на любой из продуктов, определенных выше, по желанию.

Ответ №1:

 class Image(models.Model):
    product = models.ForeignKey(ProductOne, on_delete=models.CASCADE)
    image = models.ImageField(upload_to='upload-path')
  

атрибута ‘to’ нет, вы просто ссылаетесь на нужную вам модель

Ответ №2:

Было бы лучше иметь только одну модель для всех продуктов, например:

 class Product(ProductBase):
    model = models.CharField(max_length=50)   #here for example you put the individual info from the different types of products
    color = models.CharField(max_length=50, null=True) #add null=True so you don't have to add it for all the products
    etc...
  

Тогда вам не нужна отдельная Image модель, вы можете просто добавить ее в качестве поля в свою Product модель. Я считаю, что это более чистый способ его реализации, поскольку в этом случае нет реальной необходимости иметь несколько моделей.