当另一个模型字段发生变化时,使用信号创建模型的新实例

时间:2015-12-06 23:37:11

标签: django signals models

每当ChatRoom字段更改为Offer accepted时,我都会尝试创建新的True,并为该商品创建聊天室。我所做的是一个函数,用于检查accepted字段是否变为True,然后创建ChatRoom。然后是post_save信号,它创建ChatRoom模型并将字段挂钩在一起。

问题是它是否有效但仅适用于第一个Offer已接受字段为True的情况。测试后,将另一个Offer中的已接受字段更改为True我收到以下错误:

get() returned more than one Offer -- it returned 2!

以下是我的模特:

class Offer(models.Model):
    user = models.ForeignKey(User)
    post = models.ForeignKey(Post)
    comment = models.TextField()
    accepted = models.BooleanField(default=False)

    def __str__(self):
        return "{}".format(self.comment)

    class Meta:
        verbose_name_plural = "Offers"


class ChatRoom(models.Model):
    offer = models.ForeignKey(Offer)
    title = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        verbose_name_plural = "Chat Rooms"

我使用的功能:

def create_chatroom_on_offer_accepted(sender, instance, **kwargs):
    if Offer.objects.get(accepted=True):
        ChatRoom.objects.create(offer=instance, title="Chatroom")

post_save.connect(create_chatroom_on_offer_accepted, sender=Offer)

现在我理解错误的方式是,它尝试创建ChatRoom,但实际上并不知道哪个Offer可以选择,因为有2个。

我如何确保它知道从Offer accepted创建ChatRoom的字段? 我想到了save()模型中的自定义Offer函数,用于检测accepted字段中的更改,这会触发post.save()信号来创建ChatRoom但我不确切知道这是否有效?

1 个答案:

答案 0 :(得分:1)

更改

if Offer.objects.get(accepted=True):

if instance.accepted: