我似乎不明白这个错误或如何解决它。有一些我不明白的Django模型。django模型值的错误,防止我创建一个模型,并指定字段为参数?
考虑当我尝试在Keyword
模型上执行get_or_create
时发生了什么。这里是模型,以及我在shell中编写的一些代码。
@python_2_unicode_compatible
class Keyword(models.Model):
word = models.CharField(max_length=200)
statement = models.ManyToManyField(Statement)
def __str__(self):
return self.word
>>> from gtr_site.models import *
>>> a = Statement()
>>> Keyword.objects.get_or_create(word="Testkeyword", statement=a)
Traceback (most recent call last): ...
ValueError: "<Keyword: Testkeyword>" needs to have a value for field "keyword" before this many-to-many relationship can be used.
但如果你只是写Keyword.objects.get_or_create(word="TestKeyWord")
(所以如果排除语句实例完全),然后错误消失。
我真的不明白这个错误是怎么发生的,因为... Statement
模型和Keyword
模型都没有一个名为“keyword”的字段。然而,Statement
模型确实有很多组件。这是它的代码。
@python_2_unicode_compatible
class Statement(models.Model):
statement_id = models.CharField(max_length=200)
title = models.CharField(max_length=200)
issue_date = models.DateField("Issue-Date")
author = models.ForeignKey(Person)
released_by = models.ForeignKey(Organization)
keywords = models.ManyToManyField('KeywordInContext')
solokeywords = models.ManyToManyField('Keyword', related_name='statement_keywords')
为了清晰起见,我选择排除模型中的三个选项字段。
Statements
模型中只有一个字段,实际上确实有字段被称为关键字。该领域的“关键词”,它创建了一个KeywordInContext
关系多对多这种模式如下:
@python_2_unicode_compatible
class KeywordInContext(models.Model):
keyword = models.ForeignKey(Keyword)
contexts = models.ManyToManyField(Keyword, related_name='keyword_context')
def __str__(self):
return self.keyword.word + ' (' + ', '.join(c.word for c in self.contexts.all()) + ')'
需要注意的是,该领域的关键字,使一个ForeignKey到Keyword
对象。
所以......我还是不明白这是怎么回事。当我尝试创建具有word
和statement
字段作为参数的新关键字时,我不明白为什么来自KeyInContext的字段甚至变得相关。相对于此,我如何创建Keyword
对象,并指定了word
和statement
两个参数?
嗨。我开始做一些测试,实际上是在暗示你说的是什么。但.save()在上下文中不起作用。 我执行'Statement.objects.update_or_create()'(尽管目前,我不保存实例更新或创建时)。 然后接下来是我刚刚更新或创建的Statement对象。 'cur_statement = Statement.objects.get_or_create(statement_id = statement [“statement_id”])' 但是,如果我尝试保存它...'cur_statement.save()'给出错误''元组'对象没有属性'保存'' –
没关系。我完全按照需要进行工作。我会去提供一个答案,我使用的代码(或基本上总结) –
我的部分愚蠢的错误。花了一天没有意识到你不能在创建调用中分配m2m对象。 –