5

我想为产品及其属性使用自定义中间表。我定义了以下模型,

class Products(models.Model):
    name = models.CharField(max_length=600, blank=True)
    brand = models.CharField(max_length=300, blank=True) 
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)     

class Attributes(models.Model):
    name = models.CharField(max_length=600)
    product = models.ManyToManyField(Products, through="AttributesMapping", related_name="attributes")

class AttributesMapping(models.Model):
    attribute = models.ForeignKey(Attributes)
    product = models.ForeignKey(Products)
    value = models.TextField(blank=True)

在视图中将产品对象添加到上下文并从模板中尝试通过说来获取属性

{% for attribute in product.attributes.all %}{{ attribute.name }}: {{ attribute.value }} {% endfor %}

我得到了名字,但价值没有出现。我尝试检查执行的 sql 语句。

SELECT `attributes`.`id`, `attributes`.`name` FROM `attributes` INNER JOIN `attributes_mapping` ON (`attributes`.`id` = `attributes_mapping`.`attribute_id`) WHERE `attributes_mapping`.`product_id` = 1

该值在“attributes_mapping”表中,Select 语句具有引用但未选择该字段。

提前感谢您的任何帮助或建议。

4

2 回答 2

1

请记住,value它不是在 上定义的attribute,而是在直通表上定义的。为了访问它,您需要访问属性映射对象:

for mapping in AttributesMapping.objects.get(product=product):
    print mapping.attribute.name, mapping.value 

或者:

for attribute in product.attributes.all():
    mapping = attribute.attributemapping_set.get(product=product)
    print attribute.name, mapping.value

这当然意味着你必须改变你做事的方式,因为 django 模板不支持这种函数调用。在不了解您的设置的情况下,我真的无法建议如何最好地做到这一点。

于 2013-03-15T19:06:38.207 回答
0

Attribute在模板 ( {% for attribute in product.attributes.all %}) 中获得了一个对象,但使用它就像您有一个AttributesMapping对象一样。该Attribute对象没有value属性。

于 2013-03-15T19:06:59.037 回答