【问题标题】:Run custom code when adding to Many-To-One relation添加到多对一关系时运行自定义代码
【发布时间】:2017-06-11 04:23:23
【问题描述】:
from django.db import models

class Reporter(models.Model):
    pass

class Article(models.Model):
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE, null=True)

现在每当我向记者添加文章时(如下所示)我想运行一些自定义代码,我应该覆盖什么方法(不更改 bulk=True)?

>>> new_article = Article.objects.create()
>>> new_reporter = Reporter.objects.create()
>>> new_reporter.article_set.add(new_article, bulk=True)

【问题讨论】:

    标签: django django-models overriding django-queryset django-managers


    【解决方案1】:

    答案取决于您如何在应用程序中创建对象,这将在第一次将文章添加到报告器时运行代码

    class Article(models.Model):
        reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
    
        def save(self, *args, **kwargs):
            if self.reporter:
                if not self.reporter.article__set: 
                    #do your code here
            super(Article, self).save(*args, **kwargs)
    

    如果记者上的文章发生变化,这将运行代码

    class Article(models.Model):
        reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
    
        def save(self, *args, **kwargs):
            if self.reporter:
                if not self.reporter.article__set is self: 
                    #do your code here
            super(Article, self).save(*args, **kwargs)
    

    还没有测试过,但逻辑似乎不错

    【讨论】:

    • 运行我提供的示例时没有执行保存方法
    • @OskarPersson create 方法是创建和保存的快捷方式,同样在没有记者的情况下创建文章会报错
    • 你说得对,应该。我更新了 Article 模型,报告字段可以为空。
    • @OskarPersson 所以,解决方案将取决于您如何在数据库中创建对象,我会更新答案
    • 再一次,运行我提供的示例时没有执行保存方法。这不起作用。
    猜你喜欢
    • 1970-01-01
    • 2013-02-18
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2010-12-04
    • 1970-01-01
    相关资源
    最近更新 更多