使用Django多表继承和OneToOneField
我创建了一个模型:
school/models.py:
from django.contrib.auth.models import User
(...)
class Parent(User):
contract = models.ForeignKey(Contract)
user = models.OneToOneField(User, parent_link = True, related_name = 'school_parent')
现在我想把一个普通的 Django 用户“提升”为学校的家长:
>>> from django.contrib.auth.models import User
>>> from school.models import Parent, Contract
>>> u = User(username = 'myuser')
>>> u.save()
>>> User.objects.all()
[<User: myuser>]
>>> c = Contract.objects.get(pk = 1)
>>> p = Parent(user = u, contract = c)
>>> p.save()
>>> User.objects.all()
[<User: >]
>>>
看起来在创建“家长”时,用户“myuser”被销毁了。Django 的文档显示[1],你可以通过 OneToOneField 的方式把一个模型和另一个模型“连接”起来,就像我现在做的那样。文档还提到,多表继承会自动创建一个 OneToOneField[2]。
在这种情况下,有没有办法把一个用户“提升”为家长?那如果要降级呢?
参考资料:
1 个回答
1
我猜你想要处理的是权限问题。普通的 Django 用户可以做一些事情,而家长可以做其他事情。这样理解对吗?
如果是这样的话,使用 Django 自带的权限组会更合适。你可以创建一个叫“家长”的组,这个组有一些特定的权限,而普通的 Django 用户就没有这些权限。你可以在文档中了解更多关于 权限 的信息。
如果你想给用户添加更多信息,最好是把这些信息放到一个个人资料里,使用一个 OneToOneField
来关联 User
。