2017-08-05 14 views
0

我似乎不明白这个错误或如何解决它。有一些我不明白的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对象。

所以......我还是不明白这是怎么回事。当我尝试创建具有wordstatement字段作为参数的新关键字时,我不明白为什么来自KeyInContext的字段甚至变得相关。相对于此,我如何创建Keyword对象,并指定了wordstatement两个参数?

回答

1

错误是试图告诉你,你需要保存关键字对象,然后才能通过多对多的方式链接到它。您还需要保存声明;这是因为m2m关系涉及链接表,因此双方都需要ID才能链接它们。换句话说,您不能在create调用中分配m2m字段。

至于你为什么得到这个特定的消息,我猜你有一个内存模型的旧版本,你定义的主键字段为keyword

+0

嗨。我开始做一些测试,实际上是在暗示你说的是什么。但.save()在上下文中不起作用。 我执行'Statement.objects.update_or_create()'(尽管目前,我不保存实例更新或创建时)。 然后接下来是我刚刚更新或创建的Statement对象。 'cur_statement = Statement.objects.get_or_create(statement_id = statement [“statement_id”])' 但是,如果我尝试保存它...'cur_statement.save()'给出错误''元组'对象没有属性'保存'' –

+0

没关系。我完全按照需要进行工作。我会去提供一个答案,我使用的代码(或基本上总结) –

+0

我的部分愚蠢的错误。花了一天没有意识到你不能在创建调用中分配m2m对象。 –

相关问题