自定义模型字段更改id的基础

时间:2014-05-13 16:22:24

标签: django primary-key default

我正在尝试在我的网址中使用基数为36的字符串。我编写了一个函数,将一个数字转换为36,使用字母表示高于9的数字。 我试图找到一个好方法来设置字符字段的默认值等于此函数,但我不知道如何将Django默认主键值添加到其中。有什么想法吗?

我想我可以把这样的东西放到我的模型中,但它不起作用:

base_36 = models.TextField(default=convert_base(id, 36))

2 个答案:

答案 0 :(得分:1)

你可以:

  1. Override your model's save() method

    class YourModel(models.Model):
    
        base_36 = models.TextField()
    
        def save(self, *args, **kwargs):
            # will assign a value to pk
            super(YourModel, self).save(*args, **kwargs)
            # convert the pk to base 36 and save it in our field
            self.base_36 = convert_base(self.pk, 36)
            self.save()
    
  2. 将您的base_36字段变为property

    class YourModel(models.Model):
    
        @property
        def base_36(self):
            return convert_base(self.pk,36)
    
    # can call a property just like a field:
    # print YourModel.objects.get(pk=1).base_36
    

答案 1 :(得分:0)

如果我理解正确,你想使用CharField作为主键,需要重新定义django为新对象生成其值的方式。

如果你继续这样做,我认为你的生活会变得复杂。相反,您只能在URL中使用base36标识符,并让您的视图将它们转换为与通常的主键对应的整数,如:

def my_view(request,base32_id):
   pk = base32_to_int(base32_id)
   obj = Model.objects.get(pk=pk)
   ...