Python django models Values错误,阻止我使用指定为参数的字段创建模型?e

Python django models Values错误,阻止我使用指定为参数的字段创建模型?e,python,django,django-models,models,Python,Django,Django Models,Models,我似乎不理解这个错误,也不知道如何修复它。关于django模型,我有点不明白 考虑一下当我尝试在关键字模型上执行get_或_create时会发生什么。这是模型,以及我在shell中编写的一些代码 @python_2_unicode_compatible class Keyword(models.Model): word = models.CharField(max_length=200) statement = models.ManyToManyField(Statem

我似乎不理解这个错误,也不知道如何修复它。关于django模型,我有点不明白

考虑一下当我尝试在关键字模型上执行get_或_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的字段。字段关键字与此模型中的关键字在文本中创建了多个关系,如下所示:

 @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()) + ')'
需要注意的重要一点是,field关键字将ForeignKey设置为关键字对象


所以。。。我还是不明白这是怎么发生的。当我试图创建一个新的关键字时,它的word和statement字段都作为参数,我不明白为什么KeyInContext中的字段会变得相关。关于这一点,如何创建同时指定word和语句参数的关键字对象?

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


至于你为什么会得到这个特殊的消息,我想你在内存中有一个旧版本的模型,你把主键字段定义为关键字

嗨。我开始做一些测试,实际上正是你所说的。但是.save在上下文中不起作用。我执行Statement.objects.update_或create尽管当前我没有在更新或创建时保存实例。接下来我得到的是刚刚更新或创建的Statement对象。cur_statement=statement.objects.get_或_createstatement_id=statement[statement_id],但如果我尝试保存它。。。cur_语句.save给出错误“tuple”对象没有属性“save”Nevermind。我使它完全按照预期工作。我会用我使用的代码提供一个答案,或者总结一下我的基本错误。花了一天时间没有意识到不能在create调用中分配m2m对象。
 @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()) + ')'