首页 > 解决方案 > Django:自动多对多字段中的 UUID

问题描述

我想将 UUID 用于数据库 id 而不是自动增量整数。我知道这可以通过覆盖 Model 类中的 id 来完成,例如:

from django.db import models

class Publication(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    title = models.CharField(max_length=30)

class Article(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    headline = models.CharField(max_length=100)
    publications = models.ManyToManyField(Publication)

但是,还是有问题。ManyToMany 字段的自动生成表使用自动递增的 id,而不是 UUID。

当然,这可以通过定义一个“通过”表来解决这个问题,如下所示:

...
class Article(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    headline = models.CharField(max_length=100)
    publications = models.ManyToManyField(Publication, through="ArticlePublication")

class ArticlePublication(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    article = models.ForeignKey(Article, on_delete=models.CASCADE)
    publication = models.ForeignKey(Publication, on_delete=models.CASCADE)

但是,根据 Django 文档,当您使用“通过”表时:“与普通的多对多字段不同,您不能使用 add()、create() 或 set() 来创建关系”。此外,不是“干”。

我想使用 add、create 和 set ,我喜欢 ManyToMany 字段的“DRY”功能。我也想使用 UUID 作为 id。

我为 ManyToMany 寻找一个参数来传递自动创建的“id”字段的定义,但没有。

我是否遗漏了什么,或者这是 Django 对 UUID 作为主键的支持的限制?

标签: django-models

解决方案


推荐阅读