【问题标题】:Using a variable to complete a Django query returns 'object has no attribute'使用变量完成 Django 查询返回“对象没有属性”
【发布时间】:2014-07-29 02:15:01
【问题描述】:

我正在尝试在衬衫产品数据库中创建一些查询。一个表包含所有股票和价格信息(例如,xs_stock、xs_original_price、xs_sale_price)。当客户将产品添加到他们的购物车时,它会保存它的大小,我想使用一个变量来进行适当的查询。例如:

size = 'Small'
size_query = 's_original_price'
product.shirtstyle_set.all()[0].size_query 
#substitute in 's_original_price' with query, which would work if typed by hand

相反,我得到了AttributeError: 'ShirtStyle' object has no attribute 'size_query'

我现在知道这不是设置库存数据库的最佳方式,但我想在修复它之前弄清楚这一点。提前致谢。

编辑添加我的models.py:

class ShirtStyle(models.Model):
    shirt = models.ForeignKey(Shirt)
    product_id = models.ForeignKey(Product, null=True, blank=True)
    pattern = models.CharField(max_length=50, null=False, blank=False)
    primary = models.BooleanField(default=False)
    xs_stock = models.IntegerField(default=0)
    xs_original_price = models.DecimalField(max_digits=8, decimal_places=2, default=1999, blank=False, null=False)
    xs_sale_price = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True)
    s_stock = models.IntegerField(default=0)
    s_original_price = models.DecimalField(max_digits=8, decimal_places=2, default=1999, blank=False, null=False)
    s_sale_price = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True)
    m_stock = models.IntegerField(default=0)
    m_original_price = models.DecimalField(max_digits=8, decimal_places=2, default=1999, blank=False, null=False)
    m_sale_price = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True)
    l_stock = models.IntegerField(default=0)
    l_original_price = models.DecimalField(max_digits=8, decimal_places=2, default=1999, blank=False, null=False)
    l_sale_price = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True)
    xl_stock = models.IntegerField(default=0)
    xl_original_price = models.DecimalField(max_digits=8, decimal_places=2, default=1999, blank=False, null=False)
    xl_sale_price = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True)

【问题讨论】:

    标签: django django-models django-orm


    【解决方案1】:

    正如您所说,您的数据结构可能存在更深层次的问题,但请尝试以下方法:

    试试product.shirtstyle_set.all()[0][size_query]

    【讨论】:

    • 当我尝试这个时,它给了我 'ShirtStyle' 对象没有属性 'getitem'。我即将更新问题,为您提供我的 ShirtStyle 模型。
    【解决方案2】:

    在 reddit /r/learnprogramming 上得到了答案。完整答案:

    但要回答您的问题,“s_original_price”是 模型实例,而不是字典(离子)中的值。所以你需要使用 getattr 获取模型字段的值:

    getattr(product.shirtstyle_set.all()[0], size_query)
    

    代替:

    product.shirtstyle_set.all()[0][size_query]
    

    【讨论】:

      猜你喜欢
      • 2018-02-14
      • 2012-12-18
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 1970-01-01
      • 2017-05-14
      • 1970-01-01
      相关资源
      最近更新 更多