【问题标题】:Django Model ValueErrorDjango 模型值错误
【发布时间】:2012-03-10 22:39:21
【问题描述】:

我正在我的电子邮件服务器中访问电子邮件,获取每封电子邮件的正文,然后应用正则表达式来查找填充我的 Django 模型所需的数据。

这一切都很好,除了一个字段,它作为外键链接到另一个模型字段。尽管我的电子邮件中的值与我的其他模型中列出的值相同,但它失败了....

错误:

ValueError: Cannot assign "'Humanities'": "Subject.faculty" must be a "Faculty" instance.

例如,假设每个学校科目都必须是教师的一部分。通过表单填充数据库时,对于主题的教师字段,我将菜单下拉到教师值/实例列表,因为在我的模型中定义了外键关系,即对于教师字段,我可以从人文、艺术、设计技术等

但是当我在电子邮件中找到值“Humanities”并尝试将其添加到数据库模型时,我收到了上述错误。

有人对此有所了解吗?我是愚蠢还是对我来说不仅仅是一个 ValueError,两种情况下的值都是相同的

谢谢

根据要求提供更多代码:

class Faculty(models.Model):
  name = models.CharField(primary_key=True, max_length=50)
  leader = models.CharField(max_length=50)
  email = models.EmailField()
  mailing_list = models.ManyToManyField("Contact", null=True)

class Subject(models.Model):
  name = models.CharField(max_length=50)   
  faculty = models.ForeignKey(Faculty, to_field="name")
  faculty_head = models.CharField(max_length=50)

【问题讨论】:

  • 让我们看看你的模型和一些代码!
  • 请尝试在 shell 中重现问题(./manage.py shell - 不要忘记安装 ipython 以获得更好的 shell),然后在主题中发布 shell 会话跨度>

标签: database django email models


【解决方案1】:

您的值是“人文学科”,也许您的意思是搜索人文学科(不带引号)。

【讨论】:

  • 是的,我确实这么认为,但我不明白 '' 一开始是如何到达那里的,因为在电子邮件中它不在引号中
  • 当我在提交之前打印值并将它们保存到模型中时,没有引号,这就是我感到困惑的原因
【解决方案2】:

您需要先创建一个 Faculty 实例。

faculty = Faculty(name='', leader='', email='')
faculty.save()

subject.faculty = faculty
subject.save()

【讨论】:

  • 添加了我的模型。 Humanitites 学院已经存在于我的模型中,这就是为什么我很惊讶我得到了我所做的错误 - 因为具有相同值的学院实例已经存在
【解决方案3】:

听起来您正在尝试将字符串“Humantities”分配给ForeignKey 关系。这没有意义。您需要找到或创建名为“Humanities”的实际Faculty 对象并将其分配给Subject。在你看来是这样的(取决于你的表单是如何设置的):

if form.is_valid():
  faculty_str = form.cleaned_data['faculty']
  (faculty, was_created) = Faculty.objects.get_or_create(name=faculty_str, ...)
  # It's hard to tell if you are using a ModelForm or just a normal Form. Anyway, assume we already have access to the Subject object
  subject.faculty = faculty
  subject.save()

get_or_create()

【讨论】:

  • 所以我必须找到并直接引用我的数据库中已经存在的 Faculty 对象,而不是简单地提供值?
  • 没错。您将Faculty 的实例(从数据库创建或检索)分配给subject.faculty 字段,然后使用subject.save() 将更改保存回数据库。
  • 我认为这可能是正确的方向,但只是为了澄清我可以通过表单很好地填充模型,这是我在将正则表达式应用于电子邮件然后尝试填充模型后得到的值给我添麻烦
  • Django 使用表单让您的生活变得轻松。它在幕后管理 ForeignKey 关系,同时在下拉列表中显示一个人类友好的字符串(“Humanities”)来描述 FK 与哪个对象相关。当您手动搜索电子邮件并自己做时,您没有那种奢侈 - 您必须手动查找或创建代表“人文”的对象并创建两者之间的关系
  • 你一针见血!现在你已经解释了它是有道理的。现在一切正常。谢谢楼主
猜你喜欢
  • 1970-01-01
  • 2016-02-01
  • 1970-01-01
  • 2016-11-19
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 2011-12-17
相关资源
最近更新 更多