领域关系如何在django中发挥作用

时间:2015-05-13 06:39:48

标签: django-models

我一直在粉碎我的脑袋,让我的头围绕着django的实地。

我已经在互联网上探讨了关于django关系的解释。 我是django的新手,熟悉SQL,我知道SQL中的工作方式如何,但我无法做任何django的工作。

我在stackoverflow上搜索了几个答案并没有真正帮助我,因此我不得不要求更多的解释。 因为django中的记录是django模型中的外键属性所持有的对象?它是否包含对目标模型的引用(在SQL中它包含引用关系记录的PK)。什么是'反向关系和所有那些东西'。

django的工作原理怎么样?django的方法是什么。给我提供了一些很好的表达。我很感激! 在这方面,django与SQL有何不同?

1 个答案:

答案 0 :(得分:0)

为什么不亲眼看看?

在,例如,employees / models.py:

class Manager(models.Model):
    name = models.CharField("name", max_length=40)

    def __unicode__(self):
        return self.name

class Employee(models.Model):
    manager = models.ForeignKey(Manager)
    name = models.CharField("name", max_length=40)

    def __unicode__(self):
        return self.name

然后您可以通过运行来查看此模型将生成的SQL:

$ ./manage.py makemigrations employees
Migrations for 'employees':
0001_initial.py:
- Create model Employee
- Create model Manager
- Add field manager to employee

$ ./manage.py sqlmigrate employees 0001_initial
BEGIN;
CREATE TABLE "employees_employee" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(40) NOT NULL);
CREATE TABLE "employees_manager" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(40) NOT NULL);
CREATE TABLE "employees_employee__new" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(40) NOT NULL, "manager_id" integer NOT NULL REFERENCES "employees_manager" ("id"));
INSERT INTO "employees_employee__new" ("manager_id", "id", "name") SELECT NULL, "id", "name" FROM "employees_employee";
DROP TABLE "employees_employee";
ALTER TABLE "employees_employee__new" RENAME TO "employees_employee";
CREATE INDEX "employees_employee_8784215c" ON "employees_employee" ("manager_id");

此外,如果您想知道特定查询的工作原理,那么有用的工具就是"查询"属性:

>>> print(Employee.objects.all().query)
SELECT "employees_employee"."id", "employees_employee"."manager_id", "employees_employee"."name" FROM "employees_employee"

并且不要忘记source code of Django随时可供阅读,如果你真的想要探索细节的话。