首页 > 解决方案 > 在 Django 中使用 id 进行多对多反向字段查找 | 多态模型

问题描述

我试图弄清楚如何生成正确的查询集来检索

url 和 value 字段(Attr_1 和 Attr_2 模型)

从查询Object1模型“反向集”多对多关系。这是我的例子:

模型.py:

class Text(models.Model):
    string = models.TextField()

#Entity
class Element(models.Model):
    pageline = models.IntegerField()

class Object1(Element):
    text = models.ManyToManyField(Text)

class Object2(Element):
    another_var = models.ManyToManyField(Text)
    yet_another = models.CharField(max_length=1)

#Entity
class Attribute(models.Model):
    belongsTo = models.ManyToManyField(Element)

class Attr_1(Attribute):
    url = models.URLField()

class Attr_2(Attribute):
    value = models.CharField(max_length=255)
    date = models.URLField()

如果我使用:

>> models.Object1.objects.get(pk=1).attribute_set.all()                                                                    
<QuerySet [<Attribute: Attribute object (1)>, <Attribute: Attribute object (2)>]>

>> models.Object1.objects.get(pk=1).attribute_set.values()                                                                 
<QuerySet [{'id': 1}, {'id': 2}]>

我想现在我必须查询 Attr_1 的 pk=1 和 Attr_2 的 pk=2?

属性模型是否有关系知道 id=1 是在 Attr_1 还是 Attr_2 模型中?

任何帮助表示赞赏。谢谢!

编辑:

我想知道是否可以通过使用内容类型来实现解决方案: Django 为许多表建模一个外键,我必须阅读并理解该技术。

在我看来,django-polymorphic适合我的需要。即使我不喜欢使用非内置库,并且很想通过内置模块了解解决方案。我没有手动构建有效查询集的知识。也许我的模型是错误的?

但是使用多态模型我可以查询:

>> models.Object1.objects.get(pk=1).attribute_set.all()[0].url                                                                                      
'http://www.dot.com'

我只需要捕获不会遇到的对象类型:

AttributeError: 'Attribute' object has no attribute 'url'

希望有人可以帮助或进一步解释该主题,即使我找到了适合我的东西。

标签: djangopython-3.xdjango-modelsmany-to-many

解决方案


推荐阅读