Django:自定义主键的实例化?

时间:2014-03-01 12:52:16

标签: python django

我有一个带有自定义pk字段的类,以及一个用于生成此特殊pk的类方法:

class Card(models.Model):
    custom_pk = models.BigIntegerField(primary_key=True)
    other_attr = ...

    @classmethod
    def gen_id(cls):
        # ...
        return the_id

现在,我想我可以创建对象(例如在视图中):

Card.objects.create(custom_pk=Card.gen_id(), other_attr="foo")

但是我希望使用经典的方法来获得相同的结果:

Card.objects.create(other_attr="foo")

谢谢!

1 个答案:

答案 0 :(得分:3)

您可以使用pre_save信号来提供您的主键丢失。在每次调用Card.save()方法之前都会调用此信号处理程序,因此我们需要确保在已经设置的情况下不会覆盖custom_pk

@receiver(pre_save, sender=Card)
def add_auto_pk(sender, instance, **kwargs):
    if not instance.custom_pk:
        instance.custom_pk = Card.get_id()

有关详细信息,请参阅Django signal documentation