如何在查询集中创建一个查询集?

时间:2018-08-02 11:28:52

标签: python-3.x django-2.0

我不想在Django中创建一个父子应用程序。 所以,让我解释一下我希望它如何工作。我看到了显示所有人类(父母和孩子)的视图。我单击它们中的任何一个,因此将打开一个不同的视图,其中显示了所有的孩子和父母。我可以单击其中的任何一个,然后为每个人看到相同的东西。

它只能这样工作:

SELECT CONCAT(CAST(Duration AS INT) DIV 86400, 
              ':',
              SEC_TO_TIME(CAST(Duration AS INT)  MOD 86400));

但是Child与Parent不是同一个类,因此对于子对象我看不到相同的东西。 如果我这样继承它:

.row:before, row:after {
    display: inline-block;
}

它不起作用。首先,它说我在尝试进行迁移时应该为parent_prt(或类似的东西)添加默认值。然后,如果我为他要求的字段添加默认值并进行迁移,则不会让我将其保存在db中。  因此,我想知道是否有一种方法,例如,在父查询集的每个元素中创建父查询集?

class Parent(models.Model):
      ...(name, etc.)
class Child(models.Model):
      ...(same fields)
      field = ForeignKey(Human, on_delete='CASCADE') #something like this

或者您有什么建议?

1 个答案:

答案 0 :(得分:0)

我会写评论,但是我没有足够的声誉(我是新来的)。除此之外,我还需要弄清楚你想做什么。

现在我想我明白你的意思了。 听起来您希望能够显示模板Parent(Child)类的相关对象, ,但我不确定,因为您的观点之一似乎显示了所有父母和孩子。然后单击任何一个,然后希望它再次显示所有相同的人???如果清楚显示整个视图,URL模式和完整模型,将会很有帮助。无论哪种方式,您都可以找到documentation for that here,尽管我将用自己的示例来演示它,因为它们的布局不正确。它在模板中使用related-model_set语法。

因此,在整个过程中,我将假设您想要我用黑体/斜体字表示的内容。但是在前面,如果我的假设是错误的,请指出您的代码中可能存在的错误:在您的Child模型中,您有一个Human的外键,而不是Parent ...您是否有另一个名为Human?还是您打算使每个Child与一个Parent相关,还是???您还没有完成python manage.py makemigrationspython manage.py migrate,因为您说过错误。

现在,这是我的回答,该如何做我以粗体/斜体表示的事情。

如果您希望每个孩子都与父母相关,那么您的模型应如下所示:

class Parent(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)

class Child(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    # If the parent is deleted, all kids will be deleted too... Not realistic in real life, but I assume you'll apply this principle elsewhere, such as a Blog with Comments related to it.
    parent = models.ForeignKey(Parent, on_delete=models.CASCADE)

然后要在模板中显示孩子,假设您从管理面板添加了孩子和父母,您的视图将如下所示:

def all_parents_and_kids(request):
    # to get related objects (Child), all you need to do is get the model they're related to (Parent)
    all_parents = Parent.objects.all()
    return render(request, 'all_people.html', {'all_parents': all_parents})

您的模板看起来像这样,但是您需要一些css才能使其比本示例更漂亮:

{% for parent in all_parents %}
    <section style="border: 2px blue dashed;">
        <h1>{{ parent.first_name }} {{ parent.last_name }}</h1>
        <h2>Children of this parent:</h2>
        <ul>
            {% for child in all_parents.child_set %}
                <li>{{ child.first_name }} {{ child.last_name }}</li>
            {% endfor %}
        </ul>
    </section>
{% endfor %}

这就是您想要的吗?

如果是,请给我+号,以便希望在某些时候添加注释。如果没有,请说明您的需求。