Django ManyToMany realtionship 不起作用
Django ManyToMany realtionship doesn't work
我正尝试在我的 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 查询关系字段 return 'None' 时,如下所示:
>>> q = Stuff.objects.all()
>>> p = q.tag.name
>>> print q.tag.name
None
我也不能在我的模板中使用这些键。
数据库后端是 mysql。
问题是什么?
你可以像这样调用多对多关系,
q = Stuff.objects.all()
for p in q.tag.all():
print p.name
在HTML
{%for tag in stuff.tag.all %}
{{ tag.name }}
{% endfor %}
目前尚不清楚您希望模型如何工作。您希望 Stuff 具有 单个 标签还是 多个 标签?
两种情况下的解决方案如下。
一个Stuff对象有多个Tags的情况
这里有些错误。
- 在您的示例中,变量
q
不是 Stuff 对象,因此您不能请求它的属性。这是一个queryset。就像其他答案一样,您必须像列表一样遍历它。
- 多对多关系意味着 Stuff 将具有多个标签,但您使用它时就像 Stuff 只有一个标签一样。
一个示例(我将用 Stuff.tags
替换 Stuff.tag
,因为将其称为单个标签会产生误导):
# 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 的情况
如果你想让 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:', ' }}
我正尝试在我的 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 查询关系字段 return 'None' 时,如下所示:
>>> q = Stuff.objects.all()
>>> p = q.tag.name
>>> print q.tag.name
None
我也不能在我的模板中使用这些键。
数据库后端是 mysql。
问题是什么?
你可以像这样调用多对多关系,
q = Stuff.objects.all()
for p in q.tag.all():
print p.name
在HTML
{%for tag in stuff.tag.all %}
{{ tag.name }}
{% endfor %}
目前尚不清楚您希望模型如何工作。您希望 Stuff 具有 单个 标签还是 多个 标签?
两种情况下的解决方案如下。
一个Stuff对象有多个Tags的情况
这里有些错误。
- 在您的示例中,变量
q
不是 Stuff 对象,因此您不能请求它的属性。这是一个queryset。就像其他答案一样,您必须像列表一样遍历它。 - 多对多关系意味着 Stuff 将具有多个标签,但您使用它时就像 Stuff 只有一个标签一样。
一个示例(我将用 Stuff.tags
替换 Stuff.tag
,因为将其称为单个标签会产生误导):
# 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 的情况
如果你想让 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:', ' }}