Django 模型引用 self 会抛出错误

问题描述 投票:0回答:2

我在定义 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?

感谢您的帮助。

python django uuid
2个回答
0
投票

问题在于像我一样引用模型字段

self.city
self.zip
self.country
。 Django 不接受我的做法。

是的,姜戈是对的。 在您拥有该类的实例

之前,您还无法访问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)

0
投票

不要认为这是可能的,因为您无权从可调用的默认参数访问实例。

您最好的机会是设置随机默认 uuid 并使用预保存信号用您想要的内容覆盖它。

© www.soinside.com 2019 - 2024. All rights reserved.