使用Django多表继承和OneToOneField

时间:2014-09-09 14:51:52

标签: python django inheritance django-models

我创建了以下模型:

学校/ 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 个答案:

答案 0 :(得分:1)

我假设你要找的是处理权限。普通的django用户可以做某些事情,而父母可以做其他事情。这是对的吗?

在这种情况下,更好的用例是使用具有django权限的内置组。因此,您可以创建一个名为parent的组。哪个具有某些权限,而普通的django用户无法执行这些操作。您可以在文档中详细了解permissions

如果您要向用户添加更多数据,最好将其添加到您OneToOneField

User的个人资料中