5

我使用通用外键将不同的配置文件与Users继承自auth.User. dumpdata尽管通过了--natural选项,但我无法做到。它说,

错误:无法解析序列化应用列表中 myproject.AdminProfile、myproject.TeacherProfile、myproject.Users 的依赖关系。

根据文档,据说我们需要实现natural_key 方法来获取和闪烁涉及泛型关系的固定装置。我怎么能用这里展示的模型做到这一点?

class Users(User):
    location = models.TextField('Location', blank=True)
    created_by = models.ForeignKey('self', null=True, blank=True, related_name='created_by_user')

    # Generic foreign key setup to hold the extra attributes
    profile_contenttype = models.ForeignKey(ContentType, null=True, blank=True)
    profile_object_id = models.PositiveIntegerField('Extra ID', null=True, blank=True)
    profile_object = generic.GenericForeignKey('profile_contenttype', 'profile_object_id')


class AdminProfile(models.Model):
    organization = models.CharField('Organization', max_length=100)

    # profile reverse relation to get the user
    users_link = generic.GenericRelation('Users', content_type_field='profile_contenttype',
                                         object_id_field='profile_object_id')

class TeacherProfile(models.Model):
    designation = models.CharField('Designation', max_length=100)

    # profile reverse to get the user
    users_link = generic.GenericRelation('Users', content_type_field='profile_contenttype',
                                         object_id_field='profile_object_id')

使用 Django 1.4.3 和 Postgres。

4

2 回答 2

8

您的问题似乎与缺少自然键方法无关。我使用 SQLite 在 Django 1.4 和 1.2.5 上按原样测试了您的 [原始] 代码,并且能够使用自然键转储数据而没有错误。

经过一番搜索,我发现当模型之间存在循环依赖(包括具有自引用的模型)时,就会出现此问题。正如您更新的代码所示,Users模型中有一个自我引用,所以这就是问题所在。这个错误是在 Django 1.3 中引入的,尽管已经修复,但它在稳定版本中仍然不可用 AFAIK(测试到 1.4.3)。但是,在 beta 版本 (1.5b2) 中,您的代码可以正常工作。

如果无法选择使用 beta 版本(或降级到 1.2),那么您唯一的解决方案可能确实是创建另一个模型。就像是:

class CreatedBy(models.Model):
    creator = models.ForeignKey(Users, related_name="created_by_user")
    created = models.ForeignKey(Users, unique=True, related_name="created_by")
于 2012-12-27T04:09:17.553 回答
0

更普遍的问题(涉及自然键的循环依赖,而不仅仅是使用自然键的自引用)是一个开放的错误,并在此处报告:https ://code.djangoproject.com/ticket/31051

于 2019-12-01T23:24:22.677 回答