Как объединить две модели в один режим с помощью 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)
Вернуться на верх