我想为当前用户设计一个模型,以查看他所推荐的所有人员。我创建了另一个模型来跟踪用户之间的所有推荐关系,例如“ 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”字段以获得当前用户拥有的所有关系。
是否有一种方法可以添加到外键字段中,而不仅仅是选择其中一个?有人可以给我示范一个例子吗?非常感谢。
答案 0 :(得分:1)
您不需要Referral
类。您的referred_who
字段可以“指向” CustomUser
。我将其重命名为referred_by
,并添加了related_name='referees'
。这意味着,如果用户A
推介了用户B
,而用户B
则推介了用户C
和D
,则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
方法来做到这一点,但是我希望这可以帮助您入门。