как обновить ManyToManyField при создании экземпляра - PullRequest
7 голосов
/ 19 июня 2020
• 1000 * создано!? Я пробовал это в своем CreateView form_valid
imei = Imei.objects.filter(selectmobile__item=self.object).update(active=False)
print(imei)

, и он напечатал 0? как заставить его работать либо с помощью сигналов, либо с помощью update () всякий раз, когда экземпляр создается внутри createview

Ответы [ 4 ]

4 голосов
/ 04 июля 2020

проблема поиска. мобильный поиск в 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)
1 голос
/ 10 июля 2020

Я думаю, что вы ищете отношения: 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 голосов
/ 14 июля 2020

мне пришлось использовать 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)
0 голосов
/ 19 июня 2020

Использование .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()
...