【问题标题】:Using Django Multi-table inheritance and OneToOneField使用 Django 多表继承和 OneToOneField
【发布时间】:2014-11-03 01:21:54
【问题描述】:

我创建了以下模型:

学校/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

【问题讨论】:

  • 为什么选择混合继承和OTO字段?有充分的理由吗?刚刚得知在 Django 中是可能的,但看不到重点..
  • 继承具有隐式 OTO 字段,它们在数据库中的表示方式相同。它们之间的区别在于您访问要继承的属性的方式。带OTO:p.user.name;继承:p.name。使继承的OTO字段显式,您可以指定它的属性,如related_name
  • 好的,谢谢你的清晰解释。

标签: python django inheritance django-models


【解决方案1】:

我假设您正在寻找的是处理权限。普通的 django 用户可以做某些事情,而家长可以做其他事情。对吗?

在这种情况下,更好的用例是使用具有 django 权限的内置组。因此,您可以创建一个称为父母的组。它有一定的权限,而普通的 django 用户不能做这些事情。您可以在文档中阅读有关 permissions 的更多信息。

如果您正在寻找向用户添加更多数据,最好将其添加到您有 OneToOneFieldUser 的配置文件中

【讨论】:

  • 我正在尝试同时实现这两个目标:Parent 具有普通 django 用户所没有的特定功能和特定数据。你的意思是我不应该对 User 模型使用继承?
  • 我解决它的方法是为用户创建一个配置文件,然后使用class Meta: abstract = True 创建一个基本配置文件,然后创建一个父配置文件。如果您希望我以更清晰的方式将其包含在答案中,请告诉我。
  • 为什么要创建基本配置文件而不是直接通过 OTO 字段创建配置文件?你的意思是“1.5之前”的方式吗?
猜你喜欢
  • 1970-01-01
  • 2012-03-08
  • 2011-11-23
  • 2015-08-14
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 2013-11-30
相关资源
最近更新 更多