我正在实施电子邮件列表的网络界面。当列表管理员登录时,该站点将直观地显示他们是所有者的列表以及有关列表的相应信息。为此,我决定有两张桌子:
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”设置一个值才能使用这种多对多关系。
我在这里做错了什么?
答案 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/