【问题标题】:Post_save signal implementation in DjangoDjango 中的 Post_save 信号实现
【发布时间】:2014-05-23 22:16:14
【问题描述】:

我有这样的模型:

class Devices(models.Model):
        name = models.CharField(max_length=255, blank=True)
        uniqueid = models.CharField(db_column='uniqueid'.lower(), max_length=255, blank=True) # Field name made lowercase.
        latestposition = models.ForeignKey('Positions', db_column='latestPosition_id'.lower(), blank=True, null=True) # Field name made lowercase.
        class Meta:
            db_table = 'devices'
            verbose_name = 'Devices'
            verbose_name_plural = verbose_name

        def __unicode__(self):
            return '%s' %(self.name)

        # Call the signal to create user device when the device is created.
        dispatcher.connect(save_user_device, signal=post_save, sender=Devices)


    class UsersDevices(models.Model):
        user = models.ForeignKey(settings.AUTH_USER_MODEL)
        devices = models.ForeignKey('Devices')
        class Meta:
            db_table = 'users_devices'
            verbose_name = 'User Devices'
            verbose_name_plural = verbose_name

        def __unicode__(self):
            return '%s %s' %(self.user, self.devices)

创建设备后,我想创建用户设备。 UsersDevices 中的 user 字段将登录创建设备的用户,devices 将是刚刚创建的设备。

def save_user_device(sender, instance, **kwargs):
    ## Problem is here
    instance.UsersDevices.create(   )

如何使用此信号与user instancedevice instance 一起创建UsersDevices

【问题讨论】:

    标签: django django-signals


    【解决方案1】:

    在这种情况下,您实际上并不需要信号。覆盖模型的save()方法:

    def save(self, *args, **kwargs):
    
        # Call the original save function to actually save the model:
        super(Devices, self).save(*args, **kwargs)
    
        # Now this model is saved, so we can create the UsersDevices
        UserDevices(user=get_user_from_somewhere(), devices=self).save()
    

    有关覆盖save() 方法的更多信息,请参阅文档:
    https://docs.djangoproject.com/en/1.7/topics/db/models/#overriding-model-methods

    【讨论】:

    • 嗯,我明白了。我有两个问题:哪种方法最好?我从哪里获得user instance
    • 我在 save() 方法上添加了一个参数,称为 user,但在调用 form.save(request.user) 时会引发错误。
    • @user2032220 我不知道你应该从哪里获得用户,它是你的用户:P。关于form.save(),我对您的表格一无所知...也许您应该为此提出另一个问题?
    • 我想获取当前登录的用户。就是这样。
    【解决方案2】:

    为此,最好重新定义设备模型的保存方法。但如果你想使用信号,可以这样做:

    def save_user_device(sender, instance, **kwargs):
        ## Problem is here
        UsersDevices.create(devices=instance, user=instance.user)
    

    在这种情况下,您必须将“用户”字段添加到设备模型。

    还有一个小提示:你应该给模型起单数名字,复数名字是不好的风格。

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      • 2016-05-04
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多