检索多对多字段的类

Posted

技术标签:

【中文标题】检索多对多字段的类【英文标题】:Retrieve Class of ManyToManyField 【发布时间】:2016-11-25 17:52:55 【问题描述】:

鉴于以下简化模型,我需要返回一个 ManyToManyField 的空 QuerySet,但我收到一个 "AttributeError: 'ReverseManyRelatedObjectsDescriptor' 对象没有属性 'none'"

class AnimalFamily(models.Model):
  objects = GetOrNoneManager()
  siblings = objects.none()


class Countable(models.Model):
  @classmethod
  def get_peers(cls_obj,target_animal):
    animals = cls_obj.objects.get_or_none(siblings=target_animal)
    if animals:
      return animals.siblings.exclude(id=target_animal.id)
    else
      return cls_obj.siblings.none()    # <--- this fails <----

  class Meta:
    abstract = True


class BearFamily(AnimalFamily,Countable):
  siblings = models.ManyToManyField(Bear)

class GiraffeFamily(AnimalFamily,Countable):
  siblings = models.ManyToManyField(Giraffe)


class Bear(models.Model):
  pass

class Giraffe(models.Model):
  pass

如何访问通用类方法中的“熊”类或相应的“长颈鹿”类,以返回正确查询集的空查询?

额外信息:

# dir(cls_obj.siblings) returns:
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__get__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__set__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'field', 'related_manager_cls', 'through']

【问题讨论】:

【参考方案1】:

错误消息清楚地指出了问题,即您返回的对象没有名为“none”的属性。这可能就是你想要的:

if animals:
  return animals.siblings.exclude(id=target_animal.id)
else
  cls_obj.siblings = []   
  return cls_obj.siblings

【讨论】:

遗憾的是,这没有帮助,因为我不是在寻找一个空的查询集或 cls_obj 的空列表(这将是 BearFamily 的一个空查询集),而是在寻找一个空的类的查询集,即在 ManyToMany 字段中引用(即空 Bear 或 Giraffe 查询集)。我知道这些存在,因为 'Bear.objects.none()' 确实返回一个空的查询集。 Bear 是另一个 django 类(我会将其添加到我的代码示例中以使其更加清晰) 好的,如果我理解正确的话,如果查询中没有与目标动物匹配的动物,您将尝试将查询集定义为空。在这种情况下,您不需要在基类(AnimalFamily)中设置一个空查询集,而是将该操作移到子类中。在这种情况下,您的基类定义将如下所示: class AnimalFamily(models.Model): #objects = GetOrNoneManager() 通过使用 django 方法名称作为类属性兄弟姐妹 = objects.none() class AnimalFamily(models.Model): 兄弟姐妹 = GetOrNoneManager.objects.all() 这样以后失败的行在语法上是正确的。抱歉所有格式问题 - 仍然习惯在这里发帖。

以上是关于检索多对多字段的类的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在 django 管理搜索字段中搜索多对多字段

查询 django 多对多

Django 多对多字段

Django 如何对多对多字段进行批量add

Django如何过滤多对多字段中的对象,而不是原始查询集

多对多字段返回无 django