【问题标题】:how to update ManyToManyField while an instance been created创建实例时如何更新 ManyToManyField
【发布时间】:2020-10-09 12:03:21
【问题描述】:

我想在创建实例时更新字段我尝试过signals 但它似乎对ManyToManyField 很复杂

class MobileCustomer(models.Model):
    customer = models.CharField(max_length=30)
    phone = models.CharField(max_length=13)
    mobile = models.ManyToManyField(MobileStorage,through='SelectMobile')

class SelectMobile(models.Model):
    mobile = models.ForeignKey(MobileStorage,on_delete=models.CASCADE)
    item = models.ForeignKey(MobileCustomer,on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField(default=1)
    imei = models.ManyToManyField(Imei)

class MobileStorage(models.Model):
    mobile = models.ForeignKey(Mobile,on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField()

class Mobile(models.Model):
    mobile_name = models.CharField(max_length=40,unique=True)

class Imei(models.Model):
    imei = models.CharField(max_length=15,verbose_name='IMEI',unique=True)
    mobile = models.ForeignKey(MobileStorage,on_delete=models.CASCADE)
    active = models.BooleanField(default=True)

我想在创建MobileCustomer 时更新Imei 模型中的活动字段!? 我在我的CreateView form_valid 中尝试过这个

imei = Imei.objects.filter(selectmobile__item=self.object).update(active=False)
print(imei)

它打印了 0 ? 每当在 createview 中创建实例时,如何使用信号或 update() 使其工作

【问题讨论】:

    标签: django django-models many-to-many signals


    【解决方案1】:

    我不得不使用m2m_changed 信号看起来像这样`def

    def update_m2m(sender,instance,*args,**kwargs):
         Imei.objects.filter(pk__in=kwargs.get("pk_set")).update(active=False)
    m2m_changed.connect(update_m2m,sender=SelectMobile.imei.through)
    

    【讨论】:

      【解决方案2】:

      我认为您正在寻找的关系是:Imei > MobileStorage > SelectMobile > MobileCustomer。你可以这样尝试:

      imei = Imei.objects.filter(mobile__selectmobile__item=self.object).update(active=False)
      print(imei)
      

      post_save 信号示例:

      @receiver(post_save, sender=MobileCustomer)
      def do_something(sender, instance, created, **kwargs):
          if created:
              imei = Imei.objects.filter(mobile__selectmobile__item=instance).update(active=False)
          print(imei)
      

      【讨论】:

      • 还是不行,字段不会更新,打印0,imei不是0
      • 它是多对多关系,有时我们有多个imei,因此无法更新
      【解决方案3】:

      查找问题。移动查找到 MobileStorage,然后移动客户查找到 MobileCustomer。

      def form_valid(self, form):
        # self.object = None
        super().form_valid(form)
        # self.object = a instance of MobileCustomer
        imei = Imei.objects.filter(mobile__mobilecustomer=self.object).update(active=False)
        print(imei)
      

      【讨论】:

      • 我们应该把它放在哪里?在 MobileCustomer createView 内?
      • 它是多对多关系,有时我们有多个imei,因此无法更新
      【解决方案4】:

      使用 .filter() 将返回一个列表。您想使用类似 .get() 或以下 get 或 404 来获取单个对象。

      imei = get_object_or_404(Imei, pk=imei_id)
      imei.active = False
      imei.save()
      

      如果你已经有了 self.object 的对象,你可以使用

      imei = self.object
      imei.active = False
      imei.save()
      

      【讨论】:

      • 谢谢,但没有!这不起作用,我想在创建 MobileCustomer 时更新
      猜你喜欢
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多