我不理解这个涉及两个具有多对多关系的对象的错误

时间:2014-03-13 21:27:37

标签: django

我正在实施电子邮件列表的网络界面。当列表管理员登录时,该站点将直观地显示他们是所有者的列表以及有关列表的相应信息。为此,我决定有两张桌子:

1)所有者表,其中包含有关列表管理员信息的条目。这些条目中的每一个都包含一个“ManyToManyField”,其中包含有关任何给定条目中的所有者是管理员的列表的信息。

2)一个列表,其中包含有关每个电子邮件列表信息的条目。每个条目都包含列表的名称“ManyToManyField”,其中包含有关哪些所有者是管理员列表的信息。

以下是models.py中的代码:

from django.db import models

class ListEntry(models.Model):
    name = models.CharField(max_length=64)
    owners = models.ManyToManyField('OwnerEntry')
    date = models.DateTimeField('date created')

    class Meta:
        ordering = ('name',)

class OwnerEntry(models.Model):
    name = models.CharField(max_length=32)
    lists = models.ManyToManyField('ListEntry')

    class Meta:
        ordering = ('name',)

我已经设置了一个简单的本地数据库来创建一个基本的工作网站。我使用以下代码填充了测试条目:

from list_app.models import *
from datetime import *

le1 = ListEntry(
    name = "Physics 211 email list",
    date = datetime.now(),
)
le1.save()

le2 = ListEntry(
    name = "Physics 265 email list",
    date = datetime(2014,1,1),
)
le2.save()

oe1 = OwnerEntry(
    name = 'wasingej',
)
oe1.save()
oe1.lists.add(le1,le2)
le1.owners.add(oe1)
le2.owners.add(oe1)

oe2 = OwnerEntry(
    name = 'doej',
)
oe2.save()
oe2.lists.add(le1)
le1.owners.add(oe2)

以下是我的错误发生的地方:当用户通过CAS登录时,我将它们重定向到views.py中的此页面:

def login_success(request):
    u = OwnerEntry(name=request.user)
    print(u.name)
    print(u.lists)
    return HttpResponse("login success!")

在'print(u.lists)'行中,我得到错误“”需要为字段“ownerentry”设置一个值才能使用这种多对多关系。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

您的模型结构一开始就被打破了。你不需要在关系的两个方面都需要ManyToManyFields,只有一个--Django将提供反向关系的访问者。

您的问题正在发生,因为您没有从数据库中查询现有实例,而是要实例化未保存的实例。要进行查询,请使用model.objects.get()

u = OwnerEntry.objects.get(name=request.user.username)

答案 1 :(得分:-1)

您需要为ManyToManyField构造函数提供实际的类,而不是字符串。

https://docs.djangoproject.com/en/dev/topics/db/examples/many_to_many/