当另一个模型字段更改时使用信号创建模型的新实例

Using a signal to create a new instance of a model when another models field changes

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

问题是它只对第一个 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 个

我如何确保它知道要从中创建 ChatRoomOffer accepted 字段? 我想到 Offer 模型中的自定义 save() 函数来检测 accepted 字段中的变化,这将触发 post.save() 信号以创建 ChatRoom 但我不确定这是否有效?

改变

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

if instance.accepted: