如何在Django中将2个属性一起设置为主键?

isc*_*eam 6 django django-models

我在 Django 中有一个模型:

 class Subject(models.Model):
    level = models.CharField(max_length=50)
    subject_name = models.CharField(max_length=50)
    teacher_name = models.ForeignKey(Teacher, on_delete=models.CASCADE)
    total_seats = models.IntegerField()
    subject_details = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)

对于Subject表,我希望levelsubject_name一起作为主键。事实上,我不希望任何其他对象具有相同的名称和级别。我知道我可以使用,unique_together但是我在哪里提到primary_key = True

Wil*_*sem 7

不知道。Django 不支持复合主键。这是在文档中指定的:

\n\n
\n

每个模型都需要一个字段primary_key=True(显式声明或自动添加)。

\n
\n\n

常见问题解答部分,它还继续:

\n\n
\n

Django 模型支持多列主键吗?

\n\n

。仅支持单列主键。

\n\n

但这在实践中并不是一个问题,因为没有什么可以阻止您添加其他约束(使用模型选项unique_together或直接在数据库中创建约束),并且\ n 强化该级别的唯一性。管理界面等功能需要单列主键才能工作;例如,您需要\n单个值来指定要编辑或删除的对象。

\n
\n\n

这是一个经常被请求的功能(例如,参见此Django 票证),但它没有实现。这可能会很麻烦,首先需要更新许多现有的 Django 工具(例如JOINs 应该使用两个键完成,FOREIGN KEYs 应该导致构造两个或更多字段,等等)。但另一个甚至可能更严重的问题可能是构建在 Django 之上的大量包假设主键不是组合。因此,它会破坏 Django“生态系统”中的许多包。

\n\n

有一些像django-compositekey[GitHub]这样的包这样的包旨在实现这一点。但最后一次更新是在 2014 年 10 月。

\n\n

不将其设为主键本身并不是问题。事实上,Django 的GenericForeignKey[Django-doc]仅在主键均为同一类型时才有效。所以使用unique_together应该足够了。通常这也会UNIQUE INDEX在数据库端创建一个。

\n