1

ねえ、私のモデルで信号 pre_save を動作させようとしていますが、外部キーなどに問題があるようです。私のモデルは次のようなものです:

class BlogEntry(models.Model):
    headline = models.CharField(max_length=100)
    content = models.CharField(max_length=2000)
    written_by = models.ForeignKey(User)
    date = models.DateTimeField(auto_now=True)
    project = models.ForeignKey(Project)

フォームが処理され、保存される場所は次のとおりです。

    def form_valid(self, blogform): # post a blogentry
        blog_entry = blogform.save(commit=False)
        blog_entry.written_by = self.request.user
        blog_entry.project = blog_entry.project #debugging shows that this
    is a valid instance of the Project model
        blog_entry.save()

    return TemplateResponseMixin.render_to_response(self,
self.get_context_data())

そして、これが私の信号受信機能です

@receiver(post_save, sender=BlogEntry)
def project_blog_entry_signal(sender, **kwargs):
    log = Log()
    log.project = sender.project.field
    log.content_type = Log.content_new_blogentry
    log.save()

そして、ここに例外があります:

"django.db.models.fields.related.ForeignKey object at 0x21eef86c" を割り当てることができません: "Log.project" は "Project" インスタンスでなければなりません。

@ 行 ---> log.project = sender.project.field の

project_blog_entry_signal() 関数

送信者オブジェクトは、プロジェクトをモデル インスタンスとして渡すのではなく、外部キー インスタンスとして渡すようです。何故ですか?

4

1 に答える 1

2

解決しました。「sender」引数は単なるクラス オブジェクトであり、インスタンスではありません。私のコールバックでは、次のように kwargs でインスタンスを参照できます: blog_entry_instance = kwargs["instance"]

したがって、コールバック関数は次のようになります。

@receiver(post_save, sender=BlogEntry)
def project_blog_entry_signal(sender, **kwargs):
    log = Log()
    log.project = kwargs["instance"].project
    log.content_type = Log.content_new_blogentry
    log.save()
于 2011-01-16T11:44:33.813 に答える