我在定义 Django 模型时遇到问题,其中主键是基于模型字段的 UUID5。
这是我已经得到的。
class Place(models.Model):
uuid = models.UUIDField(primary_key=True, default=uuid.uuid5('PLACE_UUID_NAMESPACE', '{}{}{}'.format(self.city, self.zip, self.country)))
city = models.CharField(max_length=24, blank=True, null=True)
zip = models.CharField(max_length=6, blank=True, null=True)
country = CountryField(default='US')
问题在于像我一样引用模型字段
self.city, self.zip, self.country
。 Django 不接受我的做法。
如何使用模型字段定义 uuid5?
感谢您的帮助。
问题在于像我一样引用模型字段
,self.city
,self.zip
。 Django 不接受我的做法。self.country
是的,姜戈是对的。 在您拥有该类的实例
之前,您还无法访问self
。所以试试这个:
class Place(models.Model):
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4)
•••
aPlace = Place(city=“Bournemouth”, zip=“blah”)
现在我们有了
aPlace
,默认情况下,它的 uuid
字段中有一个随机但唯一的标识符 (UUID),并且
CountryField(default='US')
字段中有一个 country
。另外,city
字段是“Bournemouth”
,zip
是“blah”
。 uuid
字段。
aPlace.uuid = uuid.uuid5('PLACE_UUID_NAMESPACE', '{}{}{}'.format(aPlace.city, aPlace.zip, aPlace.country))
aPlace.save()
或者直接重写模型的save方法:
def save(self, *args, **kwargs):
self.uuid = uuid.uuid5('PLACE_UUID_NAMESPACE', '{}{}{}'.format(self.city, self.zip, self.country))
super().save(*args, **kwargs)
不要认为这是可能的,因为您无权从可调用的默认参数访问实例。
您最好的机会是设置随机默认 uuid 并使用预保存信号用您想要的内容覆盖它。