当另一个模型字段更改时使用信号创建模型的新实例
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 个
我如何确保它知道要从中创建 ChatRoom
的 Offer accepted
字段?
我想到 Offer
模型中的自定义 save()
函数来检测 accepted
字段中的变化,这将触发 post.save()
信号以创建 ChatRoom
但我不确定这是否有效?
改变
if Offer.objects.get(accepted=True):
至
if instance.accepted:
我正在尝试创建一个新的 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 个
我如何确保它知道要从中创建 ChatRoom
的 Offer accepted
字段?
我想到 Offer
模型中的自定义 save()
函数来检测 accepted
字段中的变化,这将触发 post.save()
信号以创建 ChatRoom
但我不确定这是否有效?
改变
if Offer.objects.get(accepted=True):
至
if instance.accepted: