【问题标题】:Django How to add to a foreign key fieldDjango如何添加到外键字段
【发布时间】:2019-08-10 17:18:02
【问题描述】:

我想为当前用户设计一个模型,以查看他推荐的所有人。我创建了另一个模型来跟踪用户之间的所有推荐关系,例如'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”字段来获取当前用户拥有的所有关系。

有没有办法添加到外键字段而不是只选择其中一个?有人可以给我举个例子吗?非常感谢。

【问题讨论】:

  • 你做错了方向,你不需要 Referral 类。只需将referred_by = models.ForeignKey('self', ...) 字段添加到您的CustomUser。如果您想存储额外的信息(例如referral_date),您可以将ManyToMany 关系与直通表一起使用。有关详细信息,请参阅 Django 文档。
  • 您好,您能解释一下添加referred_by = models.ForeignKey('self', ...) 如何帮助我获得当前用户推荐的所有用户吗?我仍然需要一个字段供用户跟踪他推荐的人,对吗?因为我想访问“user.referral_who”来获取所有用户。
  • 这是一个非常广泛的话题,但简单地说,ForeignKey 是双向字段。请参阅 Django 文档并阅读有关关系数据库的更多信息。
  • 最好的方法是Selcuk也提到的自我参照模型,查看文档docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey

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


【解决方案1】:

您不需要 Referral 类。您的referred_who 字段可以“指向”CustomUser。我将其重命名为referred_by 并添加了related_name='referees'。这意味着如果用户A 推荐用户B 和用户B 推荐用户C 和D,那么B.referred_by == A 和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 字段中,您需要通过覆盖表单中的 save 方法来做到这一点,但我希望这能让您开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-08
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多