Django如何实现一对多自相关外键

时间:2019-03-19 05:58:47

标签: django django-models django-rest-framework

我正在实现一个用户推荐系统,现有用户可以推荐其他人使用他们提供的链接注册一个帐户。新用户注册后,新用户将被存储到现有用户的“ referred_who”字段中。

我尝试使用以下方法:

class CustomUser(AbstractBaseUser):
    ...
    referred_who = models.ManyToManyField('self', blank=True, symmetrical=False)

class ReferralAward(View):
    def get(self, request, *args, **kwargs):
        referral_id = self.request.GET['referral_id']
        current_referred = self.request.GET['referred']
        // referrer
        user = get_user_model().objects.filter(referral_id=referral_id)
        // user being referred
        referred_user = get_user_model().objects.filter(username=current_referred)

        for item in user:
            previous_referred = item.referred_who
        previous_referred.add(referred_user[0])
        user.update(referred_who=previous_referred)

我收到以下错误:

Cannot update model field <django.db.models.fields.related.ManyToManyField: referred_who> (only non-relations and foreign keys permitted).

我不确定该方法是否有效。我检查了Django Admin后端,并意识到“ Referred who”字段实际上包含所有用户。似乎它仅突出显示被推荐的用户,而不是仅显示被推荐的用户。

此外,我尝试访问后端的“ referred_who”字段,并返回“ None”。

是否有一种方法可以将用户存储在“ referred_who”字段中,以便可以看到所有被推荐的用户并在后端访问它们?例如:

referral_id = self.request.GET['referral_id']
user = get_user_model().objects.filter(referral_id=referral_id)
print(user[0].referred_who)

有人可以向我展示一种更好的方法吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

您询问如何创建1-Many字段,但是在模型中您尝试创建m2m。只需将字段更改为FK。

referred_who = models.ForeignKey('self', blank=True)

如果同一模型需要多个fks,则还需要指定related_name。您可以为其使用字段名称。 docs中的更多内容。