Как реализовать отношения изображений с абстрактной моделью в Django?

Я работаю над проектом Django, где у меня есть абстрактная модель Post, которая служит основой для двух конкретных моделей: RentalPost и RoomSeekingPost. Оба этих типа постов должны содержать несколько изображений.

Вот моя текущая структура модели:

class Post(BaseModel):
    title = models.CharField(max_length=256)
    content = models.TextField(null=True)
    status = models.CharField(max_length=10, choices=Status, default=Status.PENDING)
    
    class Meta:
        abstract = True

class RentalPost(Post):
    landlord = models.ForeignKey("accounts.User", on_delete=models.CASCADE)
    # other fields specific to rental posts
    
class RoomSeekingPost(Post):
    tenant = models.ForeignKey("accounts.User", on_delete=models.CASCADE)
    # other fields specific to room seeking posts

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

Однако я понимаю, что Django не позволяет использовать отношения ForeignKey или ManyToMany в абстрактных моделях, потому что они не могут быть правильно разрешены без конкретной таблицы.

Я рассматривал:

  1. Дублирование отношений изображения в обеих конкретных моделях (кажется избыточным)
  2. Использование общих отношений (мне не нравится такой подход)

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

Однако, я понимаю, что Django не допускает ForeignKey или ManyToMany relationships в абстрактных моделях

Нет. Django позволяет определять ForeignKeys, ManyToManyFields и т.д. на абстрактной модели. Однако это не позволяет определить отношения к абстрактной модели, что имеет смысл: к какой таблице это должно относиться?

Но, таким образом, мы можем работать с:

class Post(BaseModel):
    title = models.CharField(max_length=256)
    content = models.TextField(null=True)
    status = models.CharField(
        max_length=10, choices=Status, default=Status.PENDING
    )
    image = models.ForeignKey(MyImageModel, on_delete=models.PROTECT)
    other_images = models.ManyToManyField(
        MyImageModel, related_name='%(class)s_other'
    )

    class Meta:
        abstract = True
Вернуться на верх