【问题标题】:How to convert post_save to pre_save signals?如何将 post_save 转换为 pre_save 信号?
【发布时间】:2021-04-09 03:58:10
【问题描述】:

我已经在 Property 和 ListingDetail 模型之间建立了 OtoO 关系:

class Property(models.Model):
   .
   .
   .
    def __str__(self):
        return "Property " + str(self.pk)

ListingDetail模型:

class ListingDetial(models.Model):
    property = models.OneToOneField("properties.Property", on_delete=models.CASCADE)
   .
   .
   .

现在我不想手动选择 LocationDetail 模型中的 property 字段,而是想自动保存它。

目前我已经使用 post_save 信号来实现功能:

@receiver(post_save, sender=Property)
def ensure_sub_section_model_exists(sender, **kwargs):

    if kwargs.get('created', False):
        ListingDetial.objects.get_or_create(property=kwargs.get('instance'))

但是这种方法的问题是每次创建 Property 实例时都会创建一个 ListingDetail,这种方法的唯一问题是我需要保持所有字段都可以为空。 我想要的是在我创建ListingModel之后,属性存储的值与ListingModel的PK相同。

【问题讨论】:

    标签: django django-models django-signals


    【解决方案1】:

    如果您首先创建Property,然后将ListingDetail 添加到其中,则最好在Property 模型中包含该OneToOneField。并且不需要信号来执行此操作。

    class Property(models.Model):
        listing_detail = models.OneToOneField("properties.ListingDetail", on_delete=models.CASCADE)
    
        def save(self, *args, **kwargs):
            if not self.pk:
                self.listing_detail = ListingDetail.objects.create()
            super().save(*args, **kwargs)
    
    
    

    【讨论】:

    • 此字段为必填项,在 Django admin 中是这样说的
    • 这与上面的代码没有什么不同,其中创建了其他模型的实例,但字段仍然必须保持为空或空白才能成功创建模型。
    • 您可以在该字段中将 required 设置为 false。并且通过您的保存方法,您可以确定对于每个属性,都会创建一个 listing_detail
    猜你喜欢
    • 1970-01-01
    • 2014-03-16
    • 2010-11-16
    • 2017-04-26
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 2011-12-22
    相关资源
    最近更新 更多