Python Django model override save函数不更新数据库中的m2m字段

Python Django model override save函数不更新数据库中的m2m字段,python,django,model,Python,Django,Model,当我从管理面板添加一个新的横幅时,我想在创建时与横幅关联的关键字不会添加到db中 class Banners(models.Model): objects = BannerManager() banner_location = models.ManyToManyField(BannerLocation, verbose_name=_("Banner's Location"), default=None, null=True, blank=True) keywords =

当我从管理面板添加一个新的横幅时,我想在创建时与横幅关联的关键字不会添加到db中

class Banners(models.Model):
    objects = BannerManager()
    banner_location = models.ManyToManyField(BannerLocation, verbose_name=_("Banner's Location"), default=None, null=True, blank=True)
    keywords = models.ManyToManyField(Keywords, verbose_name=_("Banner's Related Keywords"), null=True, blank=True)
    width = models.IntegerField(verbose_name=_("Banner Width"), null=False, blank=False)
    height = models.IntegerField(verbose_name=_("Banner Height"), null=False, blank=False)
    invocation_code = models.TextField(verbose_name=_("Banner Height"), null=False, blank=False)
    is_enable = models.BooleanField(verbose_name=_("Is Enable"), default=False)
    banner_updated = models.DateTimeField(auto_now=True)
    banner_created = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name = "Banner"
        verbose_name_plural = "Banners"
        ordering = ['-banner_updated', 'is_enable']

    def __unicode__(self):
        return "width: %s, height: %s" % (self.width, self.height)

    def save(self):
        is_new = False
        if self.pk is None:
            is_new = True
        super(Banners, self).save()
        if is_new == True:
            keyword = Keywords.objects.get(pk=1)
            self.keywords.add(keyword)

如果您的管理表单中有
关键字
字段,则会发生以下情况:

  • 在管理员中的新
    横幅
    实例上按“保存”(未选择任何关键字)
  • Django管理模型表单保存
    横幅
    实例
  • 被覆盖的
    save
    方法会添加关键字
  • Django admin将keywords m2m字段设置为表单中提交的任何关键字(替换保存方法中设置的关键字)
  • Django这样做的原因是,正如您所知,在添加m2m关系之前,必须保存
    banner
    实例

    过去,我自己也曾在这方面做过一些周折,处理
    m2m\u更改的
    signal等。。。但是,在Django管理站点中,您很可能会得到一些只在有限的环境中有效的东西,但在其他代码中没有意义

    我认为您的save方法正在工作(在控制台中,在Django admin之外尝试),您真正需要的是定制管理表单的行为:

    class BannersForm(forms.ModelForm):
        class Meta:
            model = Banners
    
        def __init__(self, *args, **kwargs):
            if kwargs.get('instance') is None:
                # create new Banners
                initial = kwargs.get('initial', {})
                initial.update({'keywords': Keywords.objects.filter(pk=1)})
                kwargs['initial'] = initial
            super(BannersForm, self).__init__(*args, **kwargs)
    
    
    class BannersAdmin(admin.ModelAdmin):
        form = BannersForm
    
    
    admin.site.register(Banners, BannersAdmin)