Запрос родительского элемента из внешнего ключа django - PullRequest
1 голос
/ 03 мая 2020

У меня есть следующие модели:

class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    first_name = models.CharField(max_length=32)
    last_name = models.CharField(max_length=32)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(default=timezone.now)

    USERNAME_FIELD = 'email' # unique identifier, changed to email (default was username)
    REQUIRED_FIELDS = ['first_name', 'last_name']

    objects = CustomUserManager() # custom manager for interacting with database

    def __str__(self):
        return self.email

class Refer(models.Model) :
    referred_by = models.ForeignKey(CustomUser, on_delete=models.CASCADE, default='admin', related_name='referred_by')
    referrals = models.ManyToManyField(CustomUser, related_name='referrals', blank=True)
    unique_ref_id = models.CharField(max_length=8, blank=True, default=generate())

    def __str__(self) :
        return f'Referred By: {self.referred_by}'

Я хочу внедрить систему рефералов, используя это, у меня есть поле unique_for_id (пример 'exbvagtl'), как я могу создать нового реферала под этим пользователем?

Что-то вроде: Refer.objects.create(referred_by= CustomUser.objects.get(Refer__unique_ref_id='exbvagtl'))

Мы приветствуем лучшие модели, ресурсы и улучшения!

Ответы [ 2 ]

1 голос
/ 03 мая 2020

Проблема исходит от вашего дизайна реферальной системы. Обычно в реферальной системе один пользователь имеет один referral_id. Но ваш дизайн предполагает, что у одного пользователя может быть несколько referral_ids.

Я предлагаю вам переместить unique_ref_id в модель CustomUser. Таким образом, вы можете сделать что-то вроде этого:

Refer.objects.create (refer_by = CustomUser.objects.get (unique_ref_id = "exbvagtl"))

2-е предложение : поместите все в одну таблицу

Вы заметите, что человек, ссылающийся на другого человека, также является человеком, так что это в основном ссылка на себя. В этом отношении ваша модель CustomUser может выглядеть следующим образом:

class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    first_name = models.CharField(max_length=32)
    last_name = models.CharField(max_length=32)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(default=timezone.now)
    referred_by = models.ForeignKey(self, on_delete=models.SET_NULL, blank=True, null=True)
    unique_ref_id = models.CharField(max_length=8, blank=True, default=generate())

    USERNAME_FIELD = 'email' # unique identifier, changed to email (default was username)
    REQUIRED_FIELDS = ['first_name', 'last_name']

    objects = CustomUserManager() # custom manager for interacting with database

    def __str__(self):
        return self.email

Основываясь на этом, вы можете делать такие вещи:

Создать нового пользователя:

sponsor = CustomUser.objects.get(unique_ref_id="exbvagtl")
user = CustomUser(email=email, first_name=first_name, last_name=last_name,referred_by=sponsor)
user.save()

Получить список рефералов пользователя:

sponsor = CustomUser.objects.get(unique_ref_id="exbvagtl")
referrals = CustomUser.objects.filter(referred_by=sponsor)

Надеюсь, это поможет, если у вас есть какие-либо сомнения, не стесняйтесь спрашивать ниже.

1 голос
/ 03 мая 2020

Я думаю, вы слишком усложняете вещи. Создание объекта Refer с ForeignKey до CustomUser означает, что каждый CustomUser может иметь ноль, один или несколько Refer объектов. Хотя этим не невозможно управлять, это усложняет задачу, поскольку теперь ваши представления должны будут убедиться, что вы работаете с правильным объектом Refer, или должны «объединить» их. Более того, это означает, что CustomUser может иметь несколько unique_ref_id s.

. Вопрос в том, зачем нам такой объект. Вы можете просто создать unique_ref_id на объекте CustomUser и добавить ForeignKey к 'self', который указывает, кем был ссылающийся человек:

class CustomUser(PermissionsMixin, AbstractBaseUser):
    email = models.EmailField(unique=True)
    first_name = models.CharField(max_length=32)
    last_name = models.CharField(max_length=32)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    <b>unique_ref_id</b> = models.CharField(max_length=8, blank=True, default=generate)
    <b>referred_by</b> = models.ForeignKey(
        'self',
        related_name='referrals',
        null=True,
        default=None,
        on_delete=models.SET_NULL
    )

    USERNAME_FIELD = 'email' # unique identifier, changed to email (default was username)
    REQUIRED_FIELDS = ['first_name', 'last_name']

    objects = CustomUserManager() # custom manager for interacting with database

    def __str__(self):
        return self.email

Здесь мы, таким образом, можем добавить пользователя, который был передан другим пользователем с помощью:

CustomUser.objects.create(<b>referred_by_id=id_of_referred_user</b>)

Если впоследствии пользователь referred_by будет удален, то он будет установлен на NULL.

Вы также можете запросить пользователей, которые были переданы пользователем с:

myuser<b>.referrals.all()</b>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...