Django Сигналы post_save, которые используют внешний ключ - PullRequest
3 голосов
/ 05 марта 2020

Я пока не очень опытен в Django сигналах.

Я просто хочу, чтобы для каждых 6 новых записей введите в Пользователь , первое сохранение профиля в User_GraduateList автоматически c сохранит в GraduateUser

Таблица Пользователь

enter image description here

таблица User_GraduateList

enter image description here

Я хочу получить результат в Таблице GraduateUser

enter image description here, поскольку Джо Дио является Первая запись в User_GraduateList

Это мои модели

class User(models.Model):
    firstname = models.CharField(max_length=500, null=True,blank=True)
    lastname = models.CharField(max_length=500, null=True, blank=True)
    middlename = models.CharField(max_length=500, null=True, blank=True)

    Email  =  models.CharField(max_length=500,null=True,blank=True)
    Sponsor_User = models.ForeignKey('self', on_delete=models.CASCADE,blank=True, null=True)


class User_GraduateList(models.Model):
    User = models.ForeignKey(User, related_name='+', on_delete=models.CASCADE, blank=True)

@receiver(post_save, sender=User)
def create_graduates(sender, instance, created, **kwargs):
    sponsor = instance.Sponsor_User
    if created and sponsor:
        if sponsor.user_set.count() >= 2:
            if not User_GraduateList.objects.filter(User=sponsor).exists():
                User_GraduateList.objects.create(User=sponsor)

class GraduateUser(models.Model):
    User = models.ForeignKey(User_GraduateList, on_delete=models.CASCADE, blank=True)

    def __str__(self):
        suser = '{0.User}'
        return suser.format(self)

@receiver(post_save, sender=User)
def create_graduates(sender, instance, created, **kwargs):
    sponsor = instance
    if created and sponsor:
        print("1")
        if sponsor.user_set.count() >= 6:
            print("2")
            if not GraduateUser.objects.filter(User=sponsor).exists():
                print("3")
                GraduateUser.objects.create(User=sponsor)

Я не получаю никакой ошибки

ПРИМЕЧАНИЕ: Этот вопрос не совсем похож на мой предыдущий вопрос Django Сигнал post_save ()

ОБНОВЛЕНИЕ

@receiver(post_save, sender=User)
    def create_graduates(sender, instance, created, **kwargs):
        sponsor = instance
        print(instance)
        if created and sponsor:
            print("1")
            if sponsor.user_set.count() >= 6:
                print("2")
                if not GraduateUser.objects.filter(User=sponsor).exists():
                    print("3")
                    GraduateUser.objects.create(User=sponsor)

, когда я пытаюсь вставить данные в таблицу user,

Я получаю в cmd или терминале идентификатор каждого нового участника и 1

 >>new entry
 >>1

, пожалуйста, прочитайте это, ребята,

, если Пользователь получит 6 новая запись, первый профиль сохраняется в пользователя _GraduateList удалить и сохранить в другую таблицу GraduateUser

разница между Django Сигнал post_save () и этот вопрос: как только система обнаружит, что User.Sponsor_User (иностранный ключ в моделях Пользователь ) уже пригласил 2 пользователей, этот пользователь автоматически сохранит в User_GraduateList

ОБНОВЛЕНИЕ СНОВА

@receiver(post_save, sender=User)
def im_graduate(sender, instance, created, **kwargs):
    s = User_GraduateList.objects.filter(id = instance.id).order_by('id')
    graduate = instance
    if created and graduate:
        print(graduate.user_set.count())
        if graduate.user_set.count() == 6:
            if not GraduateUser.objects.filter(User=s).exists():
                GraduateUser.objects.create(User=s)

Я пытаюсь напечатать (Graduate.user_set.count ()), результат всегда >> 0, он не учитывает новую запись, вставленную в таблицу пользователей

Другой пример

для каждой новой записи Вставьте в Таблицу пользователей

>>New Entry 1
>>New Entry 2
>>New Entry 3
>>New Entry 4
>>New Entry 5
>>New Entry 6

, если она достигнет Новая запись 6 первая запись, которая сохраняется в User_GraduateList Table удалить и сохранить в другую таблицу GraduateUser

1 Ответ

0 голосов
/ 22 марта 2020

Исходя из того, что я понял , я попытаюсь ответить:

Прежде всего, я думаю, что в GraduateUser отношение внешнего ключа должно быть на User и не на User_GraduateList

class GraduateUser(models.Model):
    User = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)

Далее, давайте сделаем все в одном сигнале. Для этого нам не нужны два сигнала.

@receiver(post_save, sender=User)
def create_graduates(sender, instance, created, **kwargs):
    sponsor = instance.Sponsor_User
    if created and sponsor:
        user_count = sponsor.user_set.count()
        if 2 <= user_count < 6:
            if not User_GraduateList.objects.filter(User=sponsor).exists():
                User_GraduateList.objects.create(User=sponsor)
        elif user_count >= 6:
            User_GraduateList.objects.filter(User=sponsor).delete()
            if not GraduateUser.objects.filter(User=sponsor).exists():
                GraduateUser.objects.create(User=sponsor)
...