Создание "классов" с Django - PullRequest
       5

Создание "классов" с Django

2 голосов
/ 05 февраля 2010

Я только изучаю Джанго, поэтому не стесняйтесь поправлять меня в любом из моих предположений. Наверное, мне просто нужно изменить свое мышление.

Я пытаюсь создать "класс" в стиле ООП. Например, скажем, мы проектируем несколько комнат. В каждом номере есть мебель. И у каждого предмета мебели есть Тип и Цвет. Что я могу видеть до сих пор, так это то, что я могу иметь

class FurnitureType(models.Model):
    name = models.CharField(max_length=200)

class FurnitureColor(models.Model):
    name = models.CharField(max_length=50)

class FurniturePiece(models.Model):
    type = models.ForeignKey(FurnitureType)
    color = models.ForeignKey(FurnitureColor)
    sqft = models.IntegerField()
    name = models.CharField(max_length=200)

class Room(models.Model):
    name = models.CharField(max_length=200)
    furnitures = models.ManyToManyField(FurniturePiece)

Проблема в том, что каждый элемент FurniturePiece должен иметь уникальное имя, если я выбираю его из интерфейса администратора Django. Если один человек создает «Зеленую кушетку», то никто не может иметь «Зеленую кушетку». Что мне интересно, так это если а) мне нужно больше узнать о Django UI, и это правильный способ сделать это в Django или б) у меня плохой дизайн для этого домена

Причина, по которой я хочу, чтобы название «Мебель» было уникальным, заключается в том, что 10 человек могут создать «Зеленую кушетку», каждый из которых имеет свой квадратный фут.

Ответы [ 3 ]

4 голосов
/ 05 февраля 2010

У меня нет проблемы с уникальным именем. Вы можете просто указать, что он уникален:

class FurniturePiece(models.Model):
    type = models.ForeignKey(FurnitureType)
    color = models.ForeignKey(FurnitureColor)
    sqft = models.IntegerField()
    name = models.CharField(max_length=200, unique=True)

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

Я советую вам следовать учебному пособию, подобному djangobook , чтобы хорошо начать с Django.


Я думаю, проблема в том, что вы используете не Django, а в том, что вы вообще не знаете, как моделировать свое приложение.

  • Сначала вы должны подумать о том, какие объекты у вас есть (например, Комната, Мебель и т. Д.).
  • Тогда подумайте, какие у них отношения.
  • После этого вы можете моделировать их в Джанго. Конечно, чтобы сделать это, вы должны знать, как моделировать отношения. Синтаксис может быть специфичным для Django, но логические отношения - нет. Например. отношение «многие ко многим» не является чем-то специфичным для Джанго, это термин, используемый в базах данных для выражения определенных отношений.

Модели Djangos - это просто абстракция дизайна базы данных ниже.


Например, вы указали отношение "многие ко многим" между Room и FurniturePiece.
Теперь вопрос: это то, что вы хотите? Это означает, что предмет мебели может принадлежать более чем одной комнате. Это звучит странно. Поэтому, может быть, вы хотите смоделировать, что предмет мебели принадлежит только одной комнате. Но в комнате должно быть несколько предметов мебели. Поэтому мы определяем отношение от FurniturePiece до Room.

В Django мы можем выразить это с помощью:

class FurniturePiece(models.Model):
    room = models.ForeignKey(Room)
    type = models.ForeignKey(FurnitureType)
    color = models.ForeignKey(FurnitureColor)
    sqft = models.IntegerField()
    name = models.CharField(max_length=200)

Возможно, вам следует сначала узнать о реляционных базах данных , чтобы получить основы, прежде чем смоделировать ваше приложение с Django.

Возможно, это не нужно для создания приложения в Django. Но это определенно поможет вам понять, что происходит, для каждого ORM, а не только для Django.

3 голосов
/ 05 февраля 2010

Почему каждый предмет мебели должен иметь уникальное имя? Мне кажется, что если вы уберете это ограничение, все будет работать.

(кроме того, вы, кажется, случайно отбросили модели. Базовый класс модели для всех, кроме модели Room).

1 голос
/ 05 февраля 2010

Вот как бы я это сделал:

class Room(models.Model):
    name = models.CharField(max_length=255)
    pieces = models.ManyToManyField('FurniturePiece')

class FurniturePiece(models.Model):
    itemid = models.CharField(max_length=20, unique=True)  # This is what I would require to be unique.
    name = models.CharField(max_length=255)
    type = models.ForeignKey('FurnitureType')  # Note I put 'FurnitureType' in quotes because it hasn't been written yet (coming next).
    color = models.ForeignKey('FurnitureColor')  # Same here.
    width_in_inches = models.PositiveIntegerField()
    length_in_inches = models.PositiveIntegerField()

    # Next is the property decorator which allows a method to be called without using ()
    @property
    def sqft(self):
        return (self.length_in_inches * self.width_in_inches) / 144  # Obviously this is rough.


class FurnitureType(models.Model):
    name = models.CharField(max_length=255)

class FurnitureColor(models.Model):
    name = models.CharField(max_length=255)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...