【问题标题】:Django Signals: Can't Use For Loop?Django 信号:不能使用 For 循环?
【发布时间】:2021-03-19 14:19:27
【问题描述】:

当我删除信号中的 for 循环时,它可以工作(正确创建一个对象)但是当我使用 for 循环时,它应该为 Collection 对象中的每个帖子创建一个对象,但这不起作用。它甚至没有创建 Collection_List_Item 模型的对象。这个for循环不起作用有什么原因吗?有没有办法解决这个问题?

型号

class Collection(models.Model):
    posts = models.ManyToManyField(Post, related_name='collection_posts', blank=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    collection_name = models.CharField(max_length=100)
    collection_description = models.CharField(max_length=1000, blank=True)
    collection_likes = models.ManyToManyField(User, related_name='liked_collections', blank=True)
    collection_image = models.ImageField(upload_to="images/")
    private = models.BooleanField(default=False)
    follows = models.ManyToManyField(User, related_name='collection_follows', blank=True)

    def __str__(self):
        return self.collection_name

class Collection_List_Item(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, null=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    collection = models.ForeignKey(Collection, on_delete=models.CASCADE, null=True)
    saved = models.BooleanField(default=False)
    created_date = models.DateTimeField(auto_now_add=True)
    modified_date = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.collection.collection_name

信号:

@receiver(post_save, sender=Collection)
def create_collection_list_item(sender, instance, created, **kwargs):
    if created:
        for i in instance.posts.all():
            collection_list_item = Collection_List_Item.objects.create(collection=instance, user=instance.author, post=i)
        
            collection_list_item.save()

【问题讨论】:

    标签: django django-models django-signals


    【解决方案1】:

    对于ManyToManyField 字段,您必须使用m2m_changed (Django Docs) 信号。

    因为ManyToManyField 是在保存实例之后保存的,因此在所有ManyToManyField 更新中都不会有任何记录。

    from django.db.models.signals import m2m_changed
    from django.db import IntegrityError
    
    @receiver(m2m_changed, sender=Collection.posts.through)
    def create_collection_list_item(sender, instance, action, *args, **kwargs):
        if action == "post_add":
            for i in instance.posts.all():
                try:
                    collection_list_item = Collection_List_Item.objects.create(collection=instance, user=instance.author, post=i)
                except IntegrityError:
                    pass
    

    【讨论】:

    • 您能否添加一些代码来向我展示一下函数体的外观。因为我遇到了麻烦
    • 对不起,但我也得到了一个错误:'function' object has no attribute 'connect'
    • @Humza,我编辑了我的答案:@receiver(m2m_changed, sender=Collection.posts.through)。如果您使用create() 方法,则无需调用save()
    • @Humza,要一步创建和保存对象,使用 create() 方法,看docs.djangoproject.com/en/dev/topics/db/queries/…
    猜你喜欢
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多