为什么会绕过重写的save()方法?

2024-09-30 06:32:54 发布

您现在位置:Python中文网/ 问答频道 /正文

在Django模型中,我想避免双重选择,所以我写了这样一段话:

class Points(TimeStampedModel):

    ....

    def save(self, *args, **kwargs):
        if self.pk:
            super(Points, self).save(*args, **kwargs)

        else: # save() is a creation here, not an update
            if Points.objects.filter(benef_card=self.benef_card,
                                     spendable_at=self.spendable_at).exists():
                pass
            else:
                super(Points, self).save(*args, **kwargs)

我很惊讶在我的数据库中发现了这个结果:

https://www.dropbox.com/s/sevj7v5ujeo94xl/Screenshot%202015-09-20%2019.49.02.png?dl=0

我想我的代码可能有问题,但我想知道,除了我在save()方法中编写的保护之外,这些双重代码是如何存在的?你知道吗


Tags: django代码selfifsaveargscardelse
2条回答

我想你想要的是:

class Points(TimeStampedModel):
    # ...
    class Meta:
        unique_together = ('benef_card', 'spendable_at')

那么您就不需要重写save惟一性将由DB约束处理,这通常是一种方法。这种方法更好,因为save并不总是被调用(例如:批量操作),所以您可能会在应用程序中获得不同的行为。你知道吗

您可能还想签出^{},它只返回一个具有所需属性的对象,如果它不存在则创建它。你知道吗

您可以使用Django signals来代替保存前的检查。你知道吗

相关问题 更多 >

    热门问题