使用Django多表继承和OneToOneField

0 投票
1 回答
641 浏览
提问于 2025-04-20 16:26

我创建了一个模型:

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. https://docs.djangoproject.com/en/1.6/topics/db/examples/one_to_one/
  2. https://docs.djangoproject.com/en/1.6/topics/db/models/#multi-table-inheritance

1 个回答

1

我猜你想要处理的是权限问题。普通的 Django 用户可以做一些事情,而家长可以做其他事情。这样理解对吗?

如果是这样的话,使用 Django 自带的权限组会更合适。你可以创建一个叫“家长”的组,这个组有一些特定的权限,而普通的 Django 用户就没有这些权限。你可以在文档中了解更多关于 权限 的信息。

如果你想给用户添加更多信息,最好是把这些信息放到一个个人资料里,使用一个 OneToOneField 来关联 User

撰写回答