Django ManyToMany版权不起作用

时间:2015-08-04 12:34:19

标签: python mysql django django-models models

我正在尝试在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。

有什么问题?

2 个答案:

答案 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有一个标签或几个标签吗?

两种案例用途的解决方案如下。

Stuff对象具有多个标签

的情况

这里有一些错误。

  1. 在您的示例中,变量q不是Stuff对象,因此您无法询问它的属性。它是queryset。就像其他答案一样,你必须像列表一样遍历它。
  2. ManyToMany关系意味着Stuff将拥有许多标签,但您正在使用它,好像Stuff只有一个标签。
  3. 一个示例(我将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

    的情况

    如果你想要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:', ' }}