【发布时间】:2016-12-19 21:50:56
【问题描述】:
我遇到的问题是在 Selection 模型中获取选项的价格。这是因为,根据同一购物车中还有哪些其他选项,将使用不同的价格来生成总价。我需要一个查询集的帮助,它可以让我得到 Option 的价格,如果该选项有一个 effector_option 本身在同一个购物车中,则使用它,否则使用 变体,仅设置了选项字段。
TempName App 模型包括:
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
一页上可以有多个部分。每个Section 可以包含许多Options,用户稍后可以选择这些Options。选定的选项将进入购物车,用于生成总价。
在 Variation 模型中,字段选项只是告诉我 Variation 属于哪个选项。 Varaition 模型中的 effector_option 字段将被购物车使用。
用户可以选择任意数量的选项,但是,根据用户选择的选项,其他选项可能会显示变化 strong> 之前选择 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
购物车可以包含用户选择的多个选项。每个 Selection 都有一个 price 属性,可用于根据同一购物车中的其他 Option 向用户显示单个选择的价格。
我的尝试:
获取选项的所有变体。然后遍历每个变体并检查 Variation.effector_option 是否包含在同一个 Cart 中。如果是,则显示该价格,否则显示 Variation.effector_option 为空/未设置的变体中的价格。
我发现购物车中的每个 Selection 都调用了超过 26 个查询。这个 db 模式是否需要更多的规范化,或者对于这个简单的项目来说是否足够好?
【问题讨论】:
-
了解如何查询(查询集运算符)而不是循环。
-
@philipxy 是的,我已经做到了,但是我遇到的问题是查询查询集,然后查询生成的查询集。我将再次阅读文档的那部分,也许我错过了一些东西。
-
Google 'stackoverflow.com django 其他查询的查询结果'。
标签: django django-models django-queryset