Отношения один-к-одному, но нескольких типов в Django

Я создаю интернет-магазин с помощью Django. Я решил, что поскольку для продажи могут использоваться различные типы товаров, которые имеют общие атрибуты и поля, мне лучше сделать модель Item Model, а другие модели сделать ее подклассами. Итак, у меня есть абстрактная модель Item и несколько других моделей, таких как Dress, Pants и shoes. Теперь я хочу создать новую модель (например, Comment), которая должна иметь связь с моделью Item. Но поскольку модель Item является абстрактной, я не могу этого сделать. Есть ли способ иметь отношения один к одному, одна сторона которых может принимать различные типы? Что-то вроде этого:

class Comment(models.Model):

    item = models.ForeignKey(to=[Dress, Pants, Shoes])

Одно поле Foreing key может привести только к одному instance, в базе данных это будет выглядеть следующим образом:

|id|  item |
|13|t-shirt|    

Лучший способ решить вашу проблему - использовать эти три модели:

class Item_type(models.Model):
    #here you should create as many instances as you have types of your items
    # one item_type = Dress, second = Pants, third = Shoes
    title = models.CharField(max_length=50)

class Item(models.Model):
    #here you create your item, with title for example Nike Brand new shooes
    title = models.CharField(max_length=150)
    #and choosing type in oneToOneField = shooes
    item_type = models.OneToOneField(Item_type, on_delete=models.CASCADE)


class Comment(models.Model):
    #here you have your comments for your Item
    item = models.ForeignKey(Item, on_delete=models.CASCADE)

Generic Relations звучит как решение, в вашей модели Comment добавьте эти поля:

class Comment(models.Model):
    [Other fields]
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey()

и в вашей абстрактной модели Item добавьте поле GenericRelation

class Item(models.Model):
    [Other fields]
    comments = GenericRelation(Comment)
    
    class Meta:
        abstract=True
Вернуться на верх