2013-03-24 4 views
1

Я довольно новичок в Python/Django. Что я хотел бы сделать, это хранить описания автомобилей отдельно, но одновременно я хотел бы обозначить (в Джанго администратора) описание автомобиля, как это:Модели Python/Django

class CarDescription(models.Model): 

    length = models.IntegerField(max_length=10) 
    def __unicode__(self): 
     return "description of the car no %d" % (Car.id) 


class Car(models.Model): 

    description = models.OneToOneField(CarDescription) 

Я знаю, что Car.id неправильно там (круговая Справка). Есть ли способ решить эту проблему?

+1

Зачем вам хранить его отдельно, если есть отношения 1 к 1? Это сделает вашу жизнь труднее, без каких-либо преимуществ. – Andrey

+0

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

+0

Что вы думаете по этому поводу? У вас должны быть веские причины для такой безумной нормализации. – Andrey

ответ

1

Вы должны структурировать свои модели, как это:

class Car(models.Model): 

    # everything that has to do _only_ with a car 

class CarDescription(models.Model): 

    car = models.ForeignKey(Car) # each description can belong to only one car 
    length = models.IntegerField(max_length=10) 
    # other fields that have only to do with a description 

    def __unicode__(self): 
     return unicode("description of the car no %d" % (self.car.pk)) 

Django имеет очень хороший API для поиска related objects, который вы должны пройти (как только вы закончили tutorial).

1

Все, что вам нужно:

 
class Car(models.Model): 

    description = models.CharField(max_length=20) 

Done. Больше полей прекрасное. В противном случае вы чрезмерны.

Вам необходимо изучить так называемое реляционное моделирование.

Что вы делаете, это «преждевременная оптимизация» и, вероятно, «пессимизация».

0

Вы можете проверить документ django, https://docs.djangoproject.com/en/dev/topics/db/queries/#one-to-one-relationships.

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

class CarDescription(models.Model): 

    length = models.IntegerField(max_length=10) 
    def __unicode__(self): 
     return "description of the car no %d" % (self.car.id) 

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

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