2010-02-05 2 views
1

Я просто изучаю Django, поэтому не стесняйтесь исправлять меня в любых моих предположениях. Мне, наверное, просто нужно, чтобы мой настрой был скорректирован.Создание «классов» с Django

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

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. Если один человек создает «Green Couch», то никто не может иметь «Green Couch». Мне интересно, если a) мне нужно больше узнать о пользовательском интерфейсе Django, и это правильный способ его разработки в Django или b) У меня плохой дизайн для этого домена

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

+0

Любая причина, по которой вы хотели, чтобы название мебели было уникальным? – Prashanth

ответ

3

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

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 или нет. Думаю, вам нужно научиться how to define models. Интерфейс администратора - это просто сгенерированный интерфейс, основанный на ваших моделях. Вы можете change the interface в определенных аспектах, не меняя модели, но кроме того, есть меньше узнать об интерфейсе администратора.

Предлагаю вам ознакомиться с учебным пособием, например, djangobook, чтобы начать с Django.


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

  • Прежде всего, вам нужно подумать о том, какие сущности у вас есть (например, Room, Furniture и т. Д.).
  • Затем подумайте о том, какие у них отношения.
  • После этого вы можете смоделировать их в 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) 

Может быть, вы должны сначала узнать о relational databases, чтобы получить основы, прежде чем модель вашего приложения с помощью Django.

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

+0

Итак ... Я исхожу из фона ООП. Есть ли хорошие учебники по переходу от мышления ООП к мышлению БД? Я привык к Hibernate, где я могу просто создавать свои классы и спасать их. – Mason

+0

Ну это прекрасно, но вы должны об основах. Вам не нужно отказываться от мышления ООП, это совершенно нормально. Вы просто должны знать, как оно сопоставляется с таблицами базы данных. Вот почему это называется ORM: * Object-Relation-Mapping *. Это должно дать вам обзор: http://en.wikipedia.org/wiki/Relational_database –

+0

Итак, я думаю, что он просто щелкнул ... в Django, с вашим окончательным примером, он сохранит каждую связанную с ней штуку? Т.е., я думал, что если бы я дал ему кучу внешних ключей, они бы не были связаны. Но если я создам эту модель, я смогу иметь «300sqft green couch», связанный с комнатой, а не с комнатой, которая имеет «300sqft» «couch» «green»? – Mason

3

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

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

+0

Возможно, потому что я не знаю, как использовать Django :) Может быть, мне просто нужно знать, как связать кусок мебели с комнатой? Пользователь 1 может создать «Зеленый диван», который представляет собой зеленый кушетка 55 кв. Футов, а пользователь 2 может создать «Зеленый диван», который является зеленым диваном 96sqft. Если они собираются построить комнату, они оба не увидят 2 «Зеленый диван»? – Mason

+0

@ Мейсон: Да, они будут. Они также могут видеть размеры. Если они не умны и выбирают дубликаты имен, то они не умны. Но это люди, поэтому они могут смотреть на другие поля, и они могут выбирать более умные имена. –

1

Это, как я хотел бы сделать это:

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) 

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

+0

Каждой модели задано поле id по умолчанию, которое является уникальным и автоматически увеличивается. У вас есть конкретное использование в виду, кроме этого? – jathanism

+0

@synack Возможно, вы имели в виду прицел OP? – orokusaki

+0

Это классический случай ошибочного нажатия! – jathanism

Смежные вопросы