Найти - Пользователи
Полная версия: Как лучше оптимизировать модели?
Начало » Django » Как лучше оптимизировать модели?
1
Kotakota
Привет.
Есть модели описывающие параметры автомобиля (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” я оставил, что бы можно было получить все автомобили пользователя.
Как еще можно оптимизировать?
maxwell
Раз атрибуты описывают машину, то с машиной И ТОЛЬКО с машиной связывать и надо. Никак не с человеком.
Связывайте только с машиной.
svas
Сделайте одну абстрактную модель и в ней сделайте привязку к пользователю. Остальные модели наследуйте от нее.
https://docs.djangoproject.com/en/1.3/topics/db/models/#abstract-base-classes

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

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

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

Что должно произойти в таком случае?
Kotakota
maxwell, он может вводить параметры, но привязывать их (сразу) к конкретной машине пользователь не обязан.
Он может зайти в другой раз, например, изменить параметр “желтый” на “красный”, а потом привязать их к модели “Car”.
Вопрос в том, как получить введенные конкретным пользователем, но пока не привязанные к сущности “Car”, параметры.
maxwell
Kotakota, тогда, так как у вас сейчас будет нормально.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB