我有一个带有自定义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")
谢谢!
答案 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。