【问题标题】:Django Signals post_save that use foreign key使用外键的 Django 信号 post_save
【发布时间】:2020-03-05 08:00:17
【问题描述】:

我还不是很精通 Django 信号。

我只希望 User 中每输入 6 个新条目,User_GraduateList 中保存的第一个配置文件将自动保存在 GraduateUser 中/p>

用户

User_GraduateList

这是我想要的结果在表 GraduateUser

因为 Joe Dio 是 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 Signal 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)

当我尝试在表用户中插入数据时,

我在 cmd 或终端中收到每个新输入的 id 和 1

 >>new entry
 >>1

请阅读这篇文章,

如果 User 收到 6 个新条目,则将保存在 User_GraduateList 中的第一个配置文件删除并保存到另一个表 GraduateUser

Django Signal post_save() 和这个问题的区别是一旦系统检测到 User.Sponsor_User(模型中的外键 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)

我尝试 print(graduate.user_set.count()) 结果总是 >>0 ,它没有计算 用户表中插入的新条目

另一个例子

用户表

中插入每个新条目
>>New Entry 1
>>New Entry 2
>>New Entry 3
>>New Entry 4
>>New Entry 5
>>New Entry 6

如果它到达 New Entry 6 保存在 User_GraduateList Table 中的第一个条目,则删除并保存到另一个表 GraduateUser

【问题讨论】:

  • 发布您的输出和您遇到的任何错误。
  • 我没有收到任何错误和输出
  • 如果你没有得到 1 作为输出,那么你在创建用户时没有设置 Sponsor_User
  • instance.Sponsor_User 之后添加print('Sponsor: ', sponsor)。你得到了什么?
  • 等待 mr@Mathias

标签: django django-views


【解决方案1】:

根据我的understood,我会尽量回答:

首先,我认为在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)

【讨论】:

  • 如果 ""User"" 收到 6 个新条目,第一个配置文件保存在 """User_GraduateList""" 删除并保存到另一个表 ""GraduateUser""
  • 您是否按照解决方案中的建议更改了GraduateUser 模型?
猜你喜欢
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 2016-05-04
相关资源
最近更新 更多