Django:跨表的唯一ID

Django: Unique ID's across tables

我很好奇是否有一个很好的解决方案来实现表之间的唯一 ID。

class Voice(models.Model):
    id = ..          <------|
    slug = ...              |
    name = ....             |-- No duplicate IDs
                            |
class Group(models.Model):  |
    id = ..          <------|
    slug = ...
    name = ....

我希望当我在视图中获得 ID 时,从一个模型中选择会给我 None 但另一个总是 return 对象(反之亦然)。如果有更好的方法欢迎分享。现在我正在使用 slug+id 作为查询过滤器,但我想放弃它。

我不太担心唯一 ID,而是考虑数据模型关系。从你所说的来看,这听起来像是两者之间的共性,并且该模型可以有与之关联的语音、组或两者。

class NewCommonModel(models.Model):
    # common fields go here.

class Voice(models.Model):
    new_common_model = models.OneToOneField(NewCommonModel, on_delete=models.CASCADE)
    # voice specific fields


class Group(models.Model):
    new_common_model = models.OneToOneField(NewCommonModel, on_delete=models.CASCADE)
    # group specific fields

将 id 定义为 IntegerField 而不是 auto。 Voice 总是有偶数作为 id,而 Group 总是奇数。这样你甚至可以提前知道你应该寻找哪种型号

我建议使用 uuid 作为主键。解决你的独特问题,混淆你的 pk,在宇宙中是独一无二的,并且也内置在 django 中。

既然你提到了 slug,有很多方法可以让每个模型都有一个独特的 slug,你永远不需要用 pk 制作复合键。或者,出于美观原因,您可以将 slug 包含在 url 中,并仅在您的视图中过滤 pk,它应该始终是唯一的。

但通常情况下,在两个模型中具有相同的 pk 应该不是真正的问题,并且在不了解更多的情况下,我会担心你在做一些奇怪的事情。