Как реализовать отношения изображений с абстрактной моделью в 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 в абстрактных моделях, потому что они не могут быть правильно разрешены без конкретной таблицы.
Я рассматривал:
- Дублирование отношений изображения в обеих конкретных моделях (кажется избыточным)
- Использование общих отношений (мне не нравится такой подход)
Каков рекомендуемый подход к решению подобной ситуации, когда несколько конкретных моделей, наследующих от абстрактной базы, нуждаются в одинаковых отношениях?
Однако, я понимаю, что Django не допускает
ForeignKey
илиManyToMany relationships
в абстрактных моделях
Нет. Django позволяет определять ForeignKey
s, ManyToManyField
s и т.д. на абстрактной модели. Однако это не позволяет определить отношения к абстрактной модели, что имеет смысл: к какой таблице это должно относиться?
Но, таким образом, мы можем работать с:
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