Django如何添加到外键字段

时间:2019-03-20 04:19:46

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

我想为当前用户设计一个模型,以查看他所推荐的所有人员。我创建了另一个模型来跟踪用户之间的所有推荐关系,例如“ stephen-> jack”,“ stephen-> mike”

class CustomUser(AbstractBaseUser):
    // .......  a lot more fields
    referred_who = models.ForeignKey('referral', blank=True, null=True, on_delete = models.CASCADE)

class Referral(models.Model):
    referrer = models.ForeignKey(CustomUser, on_delete = models.CASCADE)
    referred = models.ForeignKey(CustomUser, on_delete = models.CASCADE,  related_name='referred')

    class Meta:
        unique_together = (("referrer", "referred"),)

    def __str__(self):
        return self.referrer.username + ' -> ' + self.referred.username

我现在遇到的问题是一个用户可以推荐多个用户,但是我用来跟踪所有推荐关系的字段“ referred_who”只能保留其中一个。在我的后端管理员中,它显示:

Referred who: stephen1 -> stephen2 (with a dropdown with all the relations but I can only choose one of them)

我想要的东西像这样:

Referred who: stephen1 -> stephen2  stephen1 -> stephen3  stephen1 -> stephen4

我可以访问“ Referred_who”字段以获得当前用户拥有的所有关系。

是否有一种方法可以添加到外键字段中,而不仅仅是选择其中一个?有人可以给我示范一个例子吗?非常感谢。

1 个答案:

答案 0 :(得分:1)

您不需要Referral类。您的referred_who字段可以“指向” CustomUser。我将其重命名为referred_by,并添加了related_name='referees'。这意味着,如果用户A推介了用户B,而用户B则推介了用户CD,则B.referred_by == A和{{1} }:

B.referees == (C, D)

然后,您可以创建一个自定义表单以在管理员中显示,例如:

class CustomUser(AbstractBaseUser):
    referred_by = models.ForeignKey('self', blank=True, null=True, on_delete = models.CASCADE, related_name='referees')

注意:这还不会将所选的用户保存在from django.contrib import admin from django import forms from django.db import models class CustomUserForm(forms.ModelForm): class Meta: model = CustomUser fields = '__all__' referees = forms.ModelMultipleChoiceField(queryset=CustomUser.objects.all()) def __init__(self, *args, **kwargs): super(CustomUserForm, self).__init__(*args, **kwargs) if self.instance: self.fields['referees'].initial = self.instance.referees.all() class CustomUserAdmin(admin.ModelAdmin): form = CustomUserForm admin.site.register(CustomUser, CustomUserAdmin) 字段中,您需要通过重写表单中的referees方法来做到这一点,但是我希望这可以帮助您入门。