Django models Django模型-在保存之前有条件地将对象添加到ManyToManyField

Django models Django模型-在保存之前有条件地将对象添加到ManyToManyField,django-models,Django Models,以下内容并不完全有效,其目的是: 保存后,检查“操作员”中是否存在“主管”,如果不存在,也将其添加到他们中 class JobRecord(models.Model): """JobRecord model""" project = models.ForeignKey(Project) date = models.DateField() supervisor = models.Foreign

以下内容并不完全有效,其目的是:

保存后,检查“操作员”中是否存在“主管”,如果不存在,也将其添加到他们中

class JobRecord(models.Model):
    """JobRecord model"""

    project             = models.ForeignKey(Project)
    date                = models.DateField()
    supervisor          = models.ForeignKey(User, related_name='supervisor_set')

    operators           = models.ManyToManyField(User, related_name='operators_set', help_text='Include the supervisor here also.')

    vehicles            = models.ManyToManyField(Vehicle, blank=True, null=True)

    def __unicode__(self):
        return u"%s - %s" % (self.project.name,  self.date.strftime('%b %d'))

    # --- over ride methods ---- #

    def save(self, **kwargs):
        # this must be done to get a pk
        super(JobRecord, self).save(**kwargs)

        # which makes this comparison possible
        if self.supervisor not in self.operators.__dict__:
            self.operators.add(self.supervisor)

        # it seems to get this far ok, but alas, the second save attempt
        # does not seem to work!
        print self.operators.values()
        super(JobRecord, self).save(**kwargs)

感谢您的专业知识,您将成为“专家”

您可以这样做来检查主管是否在操作员中:

if self.operators.filter(id=self.supervisor.id).count() == 0:

修改多对多字段后,无需再次保存。(多对多关系存储在它们自己的表中。)

好的,我已经修改了,使之成为以下内容。事实上,这两个条件似乎都起到了作用。现在的问题是add()方法不适合我

#...

def save(self, **kwargs):
    super(JobRecord, self).save(**kwargs)

    if self.operators.filter(id=self.supervisor.id).count() == 0:
    #if self.supervisor not in self.operators.values():

        # either conditional will get to this point
        self.operators.add(self.supervisor) # <-- this line doesn't save proper?
#。。。
def保存(自身,**kwargs):
超级(作业记录,自我)。保存(**kwargs)
如果self.operators.filter(id=self.supervisor.id).count()=0:
#如果self.supervisor不在self.operators.values()中:
#任何一个条件都会达到这一点

self.operators.add(self.supervisor)#我也有同样的问题。如果您使用的是django表单,请在保存表单后进行检查,然后将多对多添加到其中。这是我绕过它的唯一方法。

只是一个随机的代码评论。如果在if和dedent之后移动super().save()方法,则只需调用它一次。。。条件行得通,但是add()方法没有完全破解它?你确定它没有添加吗?你有例外吗?尝试打印self.operators.all()。您可能需要查看多对多api的用法: