检索多对多字段的类
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() 这样以后失败的行在语法上是正确的。抱歉所有格式问题 - 仍然习惯在这里发帖。以上是关于检索多对多字段的类的主要内容,如果未能解决你的问题,请参考以下文章