【问题标题】:how to get each id of each selected in M2M djnago如何在 M2M django 中获取每个选择的每个 id
【发布时间】:2020-09-27 16:27:43
【问题描述】:

我想获取所选imeis的ID

class Mobile(models.Model):
    mobile = models.CharField(max_length=20,unique=True)
    quantity = models.IntegerField()
    imei = models.ManyToMany(Imei,on_delete=models.CASCADE)

class Imei(models.Model):
    imei = models.CharField(max_length=13,unique=True)
    active = models.BooleanField(default=True)

如果我选择了 10 个 imei,我想获得所选 imeis 的 10 个 ID!? 我试过这种方法,但没有人奏效!

instance.imei__id 
instance.imei.id
instance.imei_id

感谢您的帮助

【问题讨论】:

  • “选定项目”是什么意思?你选择这些?
  • 对不起,我的意思是选择了imeis

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


【解决方案1】:

instance.imei经理。您可以通过以下方式访问Imei 对象:

instance.imei<b>.all()</b>  # QuerySet of Imei objects

或者,如果您只对 Imei 对象的主键 (pks) 感兴趣:

instance.imei<b>.values_list('pk', flat=True)</b>  # QuerySet of Imei primary keys

编辑:您可以使用以下命令更新所有值:

instance.imei<b>.all().update(active=False)</b>

例如,您可以在 CreateView 中运行它:

class MyCreateView(CreateView):
    model = Mobile
    # …

    def form_valid(self, form):
        result = super().form_valid(form)
        self.object.imei.all().update(active=False)
        return result

或者对于“嵌套”ManyToManyField

class MyCreateView(CreateView):
    model = Mobile
    # …

    def form_valid(self, form):
        result = super().form_valid(form)
        Imei.objects.filter(selectmobile__item=self.object).update(active=False)
        return result

【讨论】:

  • @art_cs:它只会更新相关的。请注意,添加项目时Mobile 上的信号将不会触发,因为这不是对象本身的保存,因此您需要m2m_changeddocs.djangoproject.com/en/3.0/ref/signals/#m2m-changed 它不会在 Mobile 模型上运行 save() 以更新 m2m 模型。所以当你创建一个对象时,m2m 是empty。只是稍后表单才会将对象添加到 m2m。
  • @art_cs:此外,信号有点反模式:lincolnloop.com/blog/django-anti-patterns-signals 在更新 Mobile 对象的 m2m 的视图中调用函数可能既简单又可靠。
  • @art_cs: 但信号不应该在上面注册,因为如前所述,如果你 create 一个对象,那么该对象有 no m2m对象。因为它首先需要创建一个对象来检索主键,然后然后它可以使用该主键来添加m2m关系对象。
  • @art:cs: 那么它就是self.object.mobile.all().update(...)。因为那是关系的名称。
  • @art_cs: 但是如果Mobile 是一个“直通”模型,您需要添加(至少)两个ForeignKeys,它们引用m2m 的源模型和目标模型。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 2021-04-18
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
相关资源
最近更新 更多