【问题标题】:Custom model field change base of id自定义模型字段更改基数
【发布时间】:2014-07-01 10:41:07
【问题描述】:

我正在尝试获取一个 36 进制的字符串以在我的 URL 中使用。我编写了一个将数字转换为基数 36 的函数,使用字母表示高于 9 的数字。 我正在尝试找到一种将字符字段的默认值设置为等于此函数的好方法,但我不确定如何将 Django 默认主键值放入其中。有什么想法吗?

我认为我可以将这样的东西放入我的模型中,但它不起作用:

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

【问题讨论】:

    标签: django primary-key default


    【解决方案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
      

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 嗯,我认为这可能是更好的解决方案,但不确定在我的视图中执行所有这些是否比从数据库中访问字符串更好。你可能是对的。我会尝试一下,可能会在一分钟内标记为正确。
      • 我想我不是希望更改主键而是创建一个包含此字符串的辅助字段。
      • 我最终混合了您的答案和其他答案。我使用@property 打印模板中的值,然后使用标准的python int(num, base) 函数在我的视图中找到正确的对象。
      猜你喜欢
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 2011-02-05
      • 2017-02-23
      • 1970-01-01
      相关资源
      最近更新 更多