Джанго: Та же модель с различными функциями? - PullRequest
0 голосов
/ 01 октября 2019

Модель объекта:

class Object(models.Model):
    author = models.ForeignKey(ProfileUser, on_delete=models.CASCADE)
    title = models.CharField(max_length=300)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    address = models.CharField(max_length=300)
    content = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    approved_object = models.BooleanField(default=False)
    admin_seen = models.BooleanField(default=False)

    def __str__(self):
        return f"{self.title}"

Модель категории:

class Category(models.Model):
    title = models.CharField(max_length=50)

    def __str__(self):
        return f"{self.title}"

Например, у меня есть несколько категорий, например, отели, рестораны и т. Д. Поэтому я хочу, чтобы у каждой категории были разные функции(переключатели при добавлении нового), но я не уверен, как правильно с этим справиться. В отелях должны быть комнаты, бассейн и т. Д. В ресторанах должны быть сельские кухни, места и т. Д. В будущем у меня будут и другие категории.

Вопрос: Какой самый лучший способ (практика)сделайте это.

Мое решение: Создать третью таблицу с объектами и каждой категорией, имеющую столбец features, и хранить объекты, разделенные запятой, но это не очень хорошее решение на основе Нормализация БД .

Ответы [ 3 ]

2 голосов
/ 01 октября 2019

Вы можете использовать абстрактные базовые классы :

Абстрактные базовые классы полезны, когда вы хотите поместить некоторую общую информацию в ряд других моделей. Вы пишете свой базовый класс и помещаете abstract = True в мета-класс. Эта модель не будет использоваться для создания таблицы базы данных. Вместо этого, когда он используется в качестве базового класса для других моделей, его поля будут добавлены к полям дочернего класса.

Затем вы можете сделать так, чтобы ваши Restaurant и Hotel модели наследовали отэтот абстрактный класс. Затем Django создаст две таблицы с базовыми полями из абстрактного класса плюс конкретные поля из каждой модели.

1 голос
/ 01 октября 2019

Я объясню это по одному:

schema

  • category таблица содержит все категории.
  • теперь может быть какая-то общая и уникальная особенность для каждой категории. features будет иметь отношение many to many к таблице category.
    , поэтому мы создаем таблицу feature_master и сопоставляем ее сТаблица категорий.
  • feature_master Таблица содержит все функции.
  • category_feature_map таблица является таблицей карт (соединительной таблицей)
  • object таблица содержит все подробности об объекте, а таблица object_detail будет содержать все feature для конкретного объекта
1 голос
/ 01 октября 2019

Вы можете использовать наследование нескольких таблиц

Вы определяете базовый объект, и оттуда вы можете определить различные дочерние объекты, которые будут иметь общие свойства родительского элемента

Inваш случай выглядит примерно так:

class Object(models.Model):
    ...


class Restaurant(Object):
   seats = IntegerField(...)
   reservations = ManyToManyField(...)

class Hotel(Object):
   rooms = IntegerField(...)
   has_pool = BooleanField(...)

Django автоматически создаст отношения и будет управлять запросами для вас. Чтобы получить все рестораны, вы можете использовать Restaurant.objects.all(), но есть ограничение. При запросе Object.objects.all() вы получите список Objects, а не их конкретный подкласс. Если я правильно помню, вы можете получить доступ к конкретному экземпляру через (например) object.restaurant.

Если вы действительно хотите получить конкретные объекты, вы можете заглянуть в библиотеку под названием Django-polymorphic .

...