我正在尝试在models.py中执行此操作:
class Tag(models.Model):
''' snip '''
name = models.CharField(max_length=30)
class Stuff(models.Model):
kind = models.CharField(max_length=30)
tag = models.ManyToManyField(Tag)
但是当我从shell中的Stuff进行查询时,关系字段会返回'None',如下所示:
>>> q = Stuff.objects.all()
>>> p = q.tag.name
>>> print q.tag.name
None
我也不能在我的模板中使用这个键。
数据库后端是mysql。
有什么问题?
答案 0 :(得分:2)
你可以像这样打多对多关系,
q = Stuff.objects.all()
for p in q.tag.all():
print p.name
在HTML中
{%for tag in stuff.tag.all %}
{{ tag.name }}
{% endfor %}
答案 1 :(得分:1)
目前还不清楚您希望模型的确切运作方式。你想要Stuff有一个单标签或几个标签吗?
两种案例用途的解决方案如下。
这里有一些错误。
q
不是Stuff对象,因此您无法询问它的属性。它是queryset。就像其他答案一样,你必须像列表一样遍历它。一个示例(我将Stuff.tag
替换Stuff.tags
,因为它将其称为单个标记具有误导性):
# Get the first stuff
>>> stuff = Stuff.objects.first()
# Access the attribute `tag`. Notice it's NOT a Tag, but a `RelatedManager`.
>>> stuff.tag
<django.db.models.fields.related.ManyRelatedManager object at 0x7fe2a3e5cc10>
# which you can use as a queryset!!
>>> stuff.tag.all()
[<Tag: tag1>, <Tag: tag2>, ...]
# Then you can iterate through it, filter or whatever
>>> stuff.tag[0]
<Tag: tag1>
>>> stuff.tag[0].name
u'tag1'
如果你想要Stuff只有一个Tag对象,你必须像这样声明它。
tag = models.OneToOneField(Tag)
现在您可以执行stuff.tag.name
并在模板中使用它。如果你想要很多标签,你必须像这样迭代Stuff的标签(再次,我在这个例子中使用标签代替标签):
{% for tag in stuff.tags %}
{{ tag.name }}
{% endfor %}
当然还有其他方法,例如使用过滤器join
{# Print the tag names joined by ', ' #}
{{ stuff.tags.all|join:', ' }}