Django: Проверка наличия объекта в queryset (если еще)
ПРОБЛЕМА: Проблема, с которой я сталкиваюсь, - это получение цены опциона в выбор модель. Это потому, что в зависимости от того, какой другой опции также находятся в одной корзине, разные цены будут использоваться для создания общей суммы. Мне нужна помощь с queryset, который получает мне цену опции, если параметр имеет effector_option что само внутри такая же тележка, использовала это, в противном случае использует вариация только с установленным полем опции.
Приложение TempName модель состоит из:
class Section(models.Model):
title = models.CharField(max_length=20)
description = models.CharField(max_length=100)
temp = models.ForeignKey(TempName, null=False)
def __str__(self):
return self.title
def get_options(self):
return self.option_set.all()
class Option(models.Model):
name = models.CharField(max_length=120)
section = models.ForeignKey(Section, null=False)
def __str__(self):
return self.name
def get_variations(self):
return self.variation_set.all()
class Variation(models.Model):
name = models.CharField(max_length=60, blank=True, unique=True)
price = models.DecimalField(max_digits=5, decimal_places=2)
option = models.ForeignKey(Option, null=False)
effector_option = models.ForeignKey(Option, null=True, blank=True, related_name='option_effected')
def __str__(self):
return self.name
может быть много разделы на одной странице. Каждый раздел может содержать много опции который позже будет выбираться пользователем. Избранные опции пойдет в корзину, которая будет использоваться для создания общей цене.
внутри вариация модель, поле опция просто говорит мне, какой вариант вариация принадлежит. The effector_option поле в Varaition модель однако будет использована тележкой.
пользователю будет разрешено выбрать любое количество опции, однако, в зависимости от опции выбранный пользователь, другие параметры могут отображать вариация цена effector_option ранее выбранный.
Приложение Корзина модель состоит из:
class Cart(models.Model):
owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True)
creation_date = models.DateTimeField(verbose_name='creation date')
checked_out = models.BooleanField(default=False, verbose_name='checked out')
class Meta:
verbose_name = 'cart'
verbose_name_plural = 'carts'
ordering = ('-creation_date',)
def __str__(self):
return unicode(self.creation_date)
def get_selections(self):
return self.selection_set.all()
class Selection(models.Model):
cart = models.ForeignKey(Cart)
option = models.ForeignKey(Option)
@property
def price(self):
return 10
корзина может содержать несколько опции который пользователь выбрал. Каждый выбор будет иметь свойство цены, которое может быть использовано, чтобы показать пользователю цену этого индивидуального выбора в зависимости от того, какой другой опции также находится в той же тележке.
ЧТО Я ПРОБОВАЛ:
получить все варианты опции. Затем пройдите через каждую вариацию и проверьте, есть ли вариация.effector_option содержится в том же корзина. Если это так, отобразите эту цену, иначе отобразите цену в пределах изменения, где изменение.effector_option имеет значение null / не установлено.
Я обнаружил, что для каждого выбор в корзину. Нуждается ли эта схема БД в большей нормализации или она достаточно хороша для этого простого проекта?
1 ответов
я обнаружил, что для каждого выбора в корзине вызывается более 26 запросов. Нуждается ли эта схема БД в большей нормализации или она достаточно хороша для этого простого проекта?
я укушу, потому что я считаю, что решение этой проблемы-разработка программного обеспечения. Проблема здесь не в нормализации, и не в Джанго. Как вы решили организовать проблема. Полагаю, вы попали в несколько ловушек, о которых я расскажу по дороге. Сначала давайте некоторые определения, прямо здесь, начиная с вашей собственной...
- раздел - группа параметров
- опции - цена
- вариация - попытка моделирования параметров, которые влияют на другие параметры
теперь у нас есть эта проблема? Некоторые из моих Option
выбор может использоваться с другими Option
выбор и влияет на цену! Хаос! Нам нужно Variation
предоставить мета-правила для их взаимоотношения. Еще Вопросы! Больше логики! Возможно...
Ловушка 1
позволяя, как вещи выглядят на экране диск вашей модели данных
я предполагаю здесь, но использование слова Section
и Option
заставьте меня почувствовать, что вы организуете экран, а не базу данных. Чаще всего компании имеют модели, которые выглядят следующим образом...
-
Product
- что-то продаем (name
,base_price
,options
,option_sets
) -
OptionSet
- группы опций, которые идут вместе как пакет сделки! Подумайте о экономии!(name
,group
,options
,price
,optionset_exclusions
,option_exclusions
) -
Option
- a la carte опции(name
,group
,price
) -
Purchase
- то, что кто-то хочет купить (product
,options
,optionsets
)
теперь вы можете сказать :" как насчет моих разделов!"Разделы могут быть чем-то таким же простым, как висит кусок метаданных от OptionSet
и Option
под названием group
С CharField
тип. При рендеринге в шаблоне вы можете группировать параметры / optionsets вместе по group
. Вы можете использовать exclusions
чтобы остановить людей от выбора конфликтующих Option
и OptionSets
на Product
. Теперь весь этот shebang можно плюхнуть на страницу всего с 3 запросами (при правильном использовании prefetch_related
) и Options
/OptionSets
можно просто добавить вместе, чтобы получить детерминированный цена.
ловушка 2
позволяя, как вы хотите, чтобы он работал предотвратить его от работы на всех
теперь, прежде чем вы запустите залп "это не может работать для меня, я снежинка!"(очень давно). Часто мы обнаруживаем, что то, как мы хотим, чтобы что-то работало, стоит на пути его работы.
старые руководители unix использовали для обсуждения достоинств согласованности, простоты и полноты. Консенсус заключается в том, что Простота лучше всего, даже если она не полная или последовательная. Ваше оригинальное решение похоже на использование сложности для достижения полноты. это ловушка!(спасибо Адмирал Акбар)
например, так работает бизнес моего / моего клиента, поэтому он должен работать таким образом
программное обеспечение дешевле / проще писать, когда мы ищем способы достижения простоты. Иногда это означает изменение организации в соответствии с ограничениями программное обеспечение.
я могу представить себе ответ на вышеизложенное, что говорится
Вариант 1 даст вам скидку 10% на Вариант 2. У вас просто статические цены!.
это можно смоделировать в схеме выше, где общая цена равна цене варианта 1 + .9 (цены варианта 2). В этом случае мы просто взяли понятие Variation
и сделал это данные, а не поведение. Гораздо проще. Его более гибким. Я имею в виду вы могли бы сделать некоторые сложные 3D Объемное исчисление цен и просто визуализация результата в вашей схеме продукта. Есть еще проблемы, которые нужно рассмотреть...
я не хочу делать всю эту конфигурацию вручную!
напишите себе команду управления Django, которая импортируется из электронной таблицы.
что делать, если цены или отношения между Options
изменить?
большинство схем продукта / цены включают понятие _spec
как Option_spec
что позволяет захватить Точка Во Времени условия покупки. _spec
записи подключены к Purchase
на момент покупки. Это позволяет Option
и OptionSet
для изменения без изменения всех подключенных прошлых покупок.
и далее по списку...
дело здесь в том, что все проблемы, о которых вы можете мечтать, имеют простые решения, если вы умны и открыты.