我在 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)
For the Subject
我想要的表level
和subject_name
一起作为主键。事实上,我不希望任何其他对象具有相同的名称和级别。我知道我可以使用unique_together
但我在哪里提到primary_key = True
?
You don't。 Django 不能与复合主键。这是在文档 https://docs.djangoproject.com/en/3.0/topics/db/models/#automatic-primary-key-fields:
每个型号都需要正好一个领域有primary_key=True
(显式声明或自动添加)。
In the 常见问题解答部分 https://docs.djangoproject.com/en/3.0/faq/models/#do-django-models-support-multiple-column-primary-keys它还继续:
Django 模型支持多列主键吗?
No。仅支持单列主键。
但这在实践中不是问题,因为没有什么可以阻止
您无需添加其他约束(使用unique_together
模型
选项或直接在数据库中创建约束),以及
强化该级别的唯一性。单列主键是
管理界面等工作所需的;例如,你需要
用于指定要编辑或删除的对象的单个值。
这是一个经常被请求的功能(例如,参见这个姜戈门票 https://code.djangoproject.com/ticket/373),但并未实施。这可能会相当麻烦,首先需要更新很多现有的 Django 工具(例如JOIN
s 应该用两个键来完成,FOREIGN KEY
然后 s 应该导致构造两个或多个字段,等等)。但另一个甚至可能更严重的问题可能是构建在 Django 之上的大量包假设主键不是组合。因此,它会破坏 Django“生态系统”中的许多包。
有一些包像django-compositekey[GitHub] https://github.com/simone/django-compositekey旨在实现这一点。但最后一次更新是在 2014 年 10 月。
不将其设为主键本身并不是问题。事实上姜戈的GenericForeignKey[Django 文档] https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.fields.GenericForeignKey仅当主键均为同一类型时才有效。所以使用unique_together
应该足够了。通常这也会使UNIQUE INDEX
在数据库端。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)