Как объединить две модели в один режим с помощью django?
У меня есть идентичные модели:
class AnimalGroup(models.Model):
name = models.CharField(max_length=50, unique=True)
description = models.TextField(max_length=1000, blank=True)
images = models.ImageField(upload_to="photos/groups")
class AnimalSubGroup(models.Model):
name = models.CharField(max_length=50, unique=True)
description = models.TextField(max_length=1000, blank=True)
images = models.ImageField(upload_to="photos/groups")
и у них есть отношения "один-ко-многим". Таким образом, AnimalGroup может иметь несколько AnimalSubGroups
Но как вы видите, у них идентичные поля.
Вопрос: как сделать одну модель этого?
Пусть они наследуют абстрактный базовый класс и дают подгруппе дополнительный внешний ключ:
class AbstractAnimalGroup(models.Model):
name = models.CharField(max_length=50, unique=True)
description = models.TextField(max_length=1000, blank=True)
images = models.ImageField(upload_to="photos/groups")
class Meta:
abstract = True
class AnimalGroup(AbstractAnimalGroup):
pass
class AnimalSubGroup(AbstractAnimalGroup):
parent = models.ForeignKey(AnimalGroup, on_delete=models.CASCADE)
Если вы хотите, чтобы подгруппы были реальными AnimalGroups, вы можете использовать multi-table inheritence:
class AnimalGroup(models.Model):
name = models.CharField(max_length=50, unique=True)
description = models.TextField(max_length=1000, blank=True)
images = models.ImageField(upload_to="photos/groups")
class AnimalSubGroup(AnimalGroup):
parent = models.ForeignKey(AnimalGroup, on_delete=models.CASCADE)
Теперь все AnimalSubGroups будут также содержаться в AnimalGroup.objects.all()
.
Вы можете использовать абстрактную базовую модель:
class NameDescImageModel(models.Model):
name = models.CharField(max_length=50, unique=True)
description = models.TextField(max_length=1000, blank=True)
images = models.ImageField(upload_to='photos/groups')
class Meta:
abstract = True
class AnimalGroup(NameDescImageModel):
pass
class AnimalSubGroup(NameDescImageModel):
group = models.ForeignKey(AnimalGroup, on_delete=models.CASCADE)