如何在创建实例时更新 ManyToManyField
how to update ManyToManyField while an instance been created
我想在创建实例时更新字段我尝试了 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() 使其工作
使用 .filter() 将 return 一个列表。您想使用 .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()
查找问题。移动查找到 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)
我想你要找的关系是: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)
我不得不使用像这样的 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)
我想在创建实例时更新字段我尝试了 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() 使其工作使用 .filter() 将 return 一个列表。您想使用 .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()
查找问题。移动查找到 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)
我想你要找的关系是: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)
我不得不使用像这样的 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)