Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 26, 2011 06:50:44

Kotakota
От:
Зарегистрирован: 2011-06-06
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше оптимизировать модели?

Привет.
Есть модели описывающие параметры автомобиля (Car):
цвет (Color), тип машины (CarType), скорость (Speed), руль (Handlebar).

class Car(models.Model):
user = model.ForeingKey(User)
name = models.CharField(max_lenght=250)
color = models.ManyToManyField('CarColor', blank=True, null=True)
type = ForeingKey('CarType', blank=True, null=True)
max_speed = ForeingKey('Speed', blank=True, null=True)
left_rigt = ManyToManyField('Handlebar', blank=True, null=True)
class Color(models.Model):
user = model.ForeingKey(User)
color = models.CharField(max_lenght=10)
class CarType(models.Model):
user = model.ForeingKey(User)
type = models.CharField(max_lenght=10)
class Speed(models.Model):
user = model.ForeingKey(User)
speed = models.IntegerField()
class Handlebar(models.Model):
user = model.ForeingKey(User)
ATTR_CHOICES = (
(1, u'Left'),
(2, u'Right'),
)
handlebar = models.IntegerField(choices=ATTR_CHOICES)
В моделях: “Color”, “CarType”, “Speed”, “Handlebar”, присутствует привязка к модели User, что бы можно было получить параметры автомобиля для каждого пользователя:
user = model.ForeingKey(User)
Так же эта привязка есть в модели “Car”, если необходимо получить все машины для пользователя.
Как можно оптимизировать дизайн модели, для исключения повторяющихся связей?
У меня есть такой вариант:
class Car(models.Model):
user = model.ForeingKey(User)
attribute = model.ForeingKey('Attribute', blank=True, null=True)
name = models.CharField(max_lenght=250)
class Attribute(models.Model):
user = model.ForeingKey(User)
name = models.CharField(max_lenght=10)
color = models.ManyToManyField('CarColor', blank=True, null=True)
type = ForeingKey('CarType', blank=True, null=True)
max_speed = ForeingKey('Speed', blank=True, null=True)
left_rigt = ManyToManyField('Handlebar', blank=True, null=True)
class Color(models.Model):
color = models.CharField(max_lenght=10)
class CarType(models.Model):
type = models.CharField(max_lenght=10)
class Speed(models.Model):
speed = models.IntegerField()
class Handlebar(models.Model):
ATTR_CHOICES = (
(1, u'Left'),
(2, u'Right'),
)
handlebar = models.IntegerField(choices=ATTR_CHOICES)
Вот такой оптимизированный вариант!
Привязку к “User” в модели “Car” я оставил, что бы можно было получить все автомобили пользователя.
Как еще можно оптимизировать?



Офлайн

#2 Сен. 26, 2011 12:05:27

maxwell
От:
Зарегистрирован: 2008-08-26
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше оптимизировать модели?

Раз атрибуты описывают машину, то с машиной И ТОЛЬКО с машиной связывать и надо. Никак не с человеком.
Связывайте только с машиной.



Офлайн

#3 Сен. 26, 2011 12:08:45

svas
От:
Зарегистрирован: 2010-01-27
Сообщения: 239
Репутация: +  9  -
Профиль   Отправить e-mail  

Как лучше оптимизировать модели?

Сделайте одну абстрактную модель и в ней сделайте привязку к пользователю. Остальные модели наследуйте от нее.
https://docs.djangoproject.com/en/1.3/topics/db/models/#abstract-base-classes

А вообще, зачем в моделях Color, Handlebar,… поле user? У каждого пользователя будут свои цвета, …? По крайней мере в HandleBar поле user не нужно, я думаю.

Расскажите немного поподробнее о задаче которую решаете.



Отредактировано (Сен. 26, 2011 12:16:15)

Офлайн

#4 Сен. 26, 2011 12:45:48

Kotakota
От:
Зарегистрирован: 2011-06-06
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше оптимизировать модели?

svas, Поле “user”, в моделях “Color”, “Handlebar”, “CarType” и “Speed” сделано для того, чтобы авторизированный пользователь мог посмотреть, какие параметры машин он добавил. А именно цвета, рули, тип машины и скорость.
Без привязки к конкретному автомобилю!
Можно было оставить поле “User”, только в модели “Car”, но тогда чтобы получить параметры машины для пользователя, пришлось бы парсить таблицу Car где указан данный пользователь и дальше уже читать параметры из “Color”, “Handlebar”, “CarType” и “Speed”.
Задача сделать сайт по аренде машин.

maxwell, а как в этом случае узнать, какие параметры добавил авторизированный пользоваль?
У авторизированного пользователя в его админке, должно быть 4 таблицы:
Цвета (Color), Рули (Handlebar), Скорость (Speed) и Тип машины (CarType).
в каждой из таблиц должно быть выведено все, что добавил пользователь, без привязки к определенной машине!
Пример:
Color: Handlebar: Speed CarType
красный левый 150 легковая
синий правый 180 фура
и т.д. и т.д.



Отредактировано (Сен. 26, 2011 12:52:48)

Офлайн

#5 Сен. 26, 2011 13:02:46

maxwell
От:
Зарегистрирован: 2008-08-26
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше оптимизировать модели?

Kotakota, что-то с архитектурой не то.
Пользователь может вводить свои какие-то параметры машины (которые никак не связаны с конкретной машиной).
Так же пользователь может заводить машины (бгыы, каламбур) у которых так же есть свои параметры.
Добавил я себе:
Color: Handlebar: Speed CarType
красный левый 150 легковая
синий правый 180 фура

Потом добавил машину:
Color: Handlebar: Speed CarType
желтый левый 150 легковая

Что должно произойти в таком случае?



Отредактировано (Сен. 26, 2011 13:03:05)

Офлайн

#6 Сен. 26, 2011 13:08:36

Kotakota
От:
Зарегистрирован: 2011-06-06
Сообщения: 40
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше оптимизировать модели?

maxwell, он может вводить параметры, но привязывать их (сразу) к конкретной машине пользователь не обязан.
Он может зайти в другой раз, например, изменить параметр “желтый” на “красный”, а потом привязать их к модели “Car”.
Вопрос в том, как получить введенные конкретным пользователем, но пока не привязанные к сущности “Car”, параметры.



Офлайн

#7 Сен. 26, 2011 13:45:06

maxwell
От:
Зарегистрирован: 2008-08-26
Сообщения: 111
Репутация: +  0  -
Профиль   Отправить e-mail  

Как лучше оптимизировать модели?

Kotakota, тогда, так как у вас сейчас будет нормально.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version