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表,我希望level和subject_name一起作为主键。事实上,我不希望任何其他对象具有相同的名称和级别。我知道我可以使用,unique_together但是我在哪里提到primary_key = True?
你不知道。Django 不支持复合主键。这是在文档中指定的:
\n\n\n\n\n每个模型都需要一个字段
\nprimary_key=True(显式声明或自动添加)。
在常见问题解答部分,它还继续:
\n\n\n\n\nDjango 模型支持多列主键吗?
\n\n不。仅支持单列主键。
\n\n但这在实践中并不是一个问题,因为没有什么可以阻止您添加其他约束(使用模型选项
\nunique_together或直接在数据库中创建约束),并且\ n 强化该级别的唯一性。管理界面等功能需要单列主键才能工作;例如,您需要\n单个值来指定要编辑或删除的对象。
这是一个经常被请求的功能(例如,参见此Django 票证),但它没有实现。这可能会很麻烦,首先需要更新许多现有的 Django 工具(例如JOINs 应该使用两个键完成,FOREIGN KEYs 应该导致构造两个或更多字段,等等)。但另一个甚至可能更严重的问题可能是构建在 Django 之上的大量包假设主键不是组合。因此,它会破坏 Django“生态系统”中的许多包。
有一些像django-compositekey[GitHub]这样的包这样的包旨在实现这一点。但最后一次更新是在 2014 年 10 月。
不将其设为主键本身并不是问题。事实上,Django 的GenericForeignKey[Django-doc]仅在主键均为同一类型时才有效。所以使用unique_together应该足够了。通常这也会UNIQUE INDEX在数据库端创建一个。
| 归档时间: |
|
| 查看次数: |
9398 次 |
| 最近记录: |