Django无法进行迁移:目前无法为关注者创建表单字段。由于尚未加载其相关模型“自我”

时间:2019-06-02 10:07:53

标签: django django-models

这是模型。

class CustomUser(AbstractUser):
    followers = ArrayField(ArrayField(models.ForeignKey('self',
                                                        related_name = 'following_set',
                                                        on_delete = models.CASCADE ), size = 1))
    followings = ArrayField(ArrayField(models.ForeignKey('self',
                                                        related_name = 'follower_set',
                                                        on_delete = models.CASCADE ), size = 1))

1 个答案:

答案 0 :(得分:3)

正如ArrayField [Django-doc]上的文档所述,您不能使用ForeignKey [Django-doc]

  

base_field

     

这是必填参数。

     

指定数组的基础数据类型和行为。它   应该是Field子类的实例。例如,它可以   是IntegerFieldCharField。允许使用大多数字段类型,   与那些处理关系数据的人例外   ( ForeignKey OneToOneField ManyToManyField )。

此外,ArrayField通常不是不是的好习惯。许多数据库后端不支持这些字段,而且它们很容易导致复杂的查询,而且无论如何,它们上都没有有效的索引结构:如果您想找出常见的追随者是什么的两个用户,这将导致一些复杂的逻辑。如果必须在数组内部进行查询,则它肯定不会遵循数据库first normal form (1NF) [wiki]的条件。虽然当然可以争论1NF是否总是提高数据库的整体质量,但我认为这绝对是另一种说法,即通常应将ArrayField用作“最后手段”,或者如果数组是一个“原子”对象。

最后,通过使用两个数组,使两个数组保持同步将是一项技术难题:如果a不再跟随b,则应从{删除a followers中的{1}},但也应从b的{​​{1}}中删除b。这看起来很简单,但是最终用例的数量会增加,最终会导致一些错误。

您可以构建ManyToMany model [Django-doc],例如:

followings

这将在两者之间创建一个隐藏表。通过指定symmetrical=False [Django-doc],这意味着如果用户a正在关注用户class CustomUser(AbstractUser): followers = models.ManyToManyField( 'self', symmetrical=False, related_name='following' ),那么u1本身就不会{em> 跟随{{1} }。

如果您想以“以下”关系添加额外数据,例如某个用户开始关注另一个用户的时间戳,则可以制作一个像u2这样的模型,并将其指定为through= u2的模型。