【问题标题】:Django ManyToMany access in save() functionsave() 函数中的 Django ManyToMany 访问
【发布时间】:2016-09-19 01:10:55
【问题描述】:

我想在模型的 .save() 方法期间根据用户输入创建其他对象。信息存储在多对多关系.available_specs 中。

我的代码有效,如果一个人按两次保存,但不是第一次。此处的 cmets 中也描述了该问题Django foreign key access in save() function

这是我的工作:

def save(self, *args, **kwargs):

    my_save_result = super().save(*args, **kwargs) #save first to create an id
    self.refresh_from_db() #just as a test, did not help at all

    #the following line is the problem: 
    #   in the first save, available_specs.all() returns []
    #   when I re-open the model and save again, I get the correct list
    for spec in self.available_specs.all():
        VehicleSpec.objects.get_or_create(vehicle=self, spec=spec)

    return my_save_result

我正在使用 Python 3.5 和 Django 1.9

编辑: 我尝试使用以下代码使用post_save() 信号(并删除了覆盖的保存()方法):

@receiver(post_save, sender=VehicleModel)
def create_dependent_vehicle_specs(sender, **kwargs):
    vehicle = kwargs['instance']

    #in the first save-process I get an empty list here, 
    #after I hit save again, the code works. 
    print(vehicle, vehicle.available_specs.all())
    for spec in vehicle.available_specs.all():
        VehicleSpec.objects.get_or_create(vehicle=vehicle, spec=spec)

Edit2: m2m_changed 成功了:

@receiver(m2m_changed, sender=VehicleModel)
def create_dependent_vehicle_specs(sender, **kwargs):
    vehicle = kwargs['instance']
    for spec in vehicle.available_specs.all():
        VehicleSpec.objects.get_or_create(vehicle=vehicle, spec=spec)

m2m_changed.connect(create_dependent_vehicle_specs, sender=VehicleModel.available_specs.through)  # @UndefinedVariable

顺便说一句:这里有一个相关问题:Django accessing ManyToMany fields from post_save signal

【问题讨论】:

  • 您是否尝试在post_save 信号中这样做?
  • 我刚试了一下,效果一样

标签: python django python-3.x django-models


【解决方案1】:

您需要使用m2m_changed signal。你不应该在另一个模型的保存方法中调用另一个模型的get_or_create

【讨论】:

    猜你喜欢
    • 2010-09-23
    • 2022-01-23
    • 2021-07-03
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2021-10-31
    相关资源
    最近更新 更多