这是模型。
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))
答案 0 :(得分:3)
正如ArrayField
[Django-doc]上的文档所述,您不能使用ForeignKey
[Django-doc]:
base_field
这是必填参数。
指定数组的基础数据类型和行为。它 应该是
Field
子类的实例。例如,它可以 是IntegerField
或CharField
。允许使用大多数字段类型, 与那些处理关系数据的人例外 (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
的模型。