Django 当我将_unicode__)方法的默认返回值更改为传递多个外键时会发生什么
我想知道,在数据库效率方面,我是否编辑returnDjango 当我将_unicode__)方法的默认返回值更改为传递多个外键时会发生什么,django,django-models,Django,Django Models,我想知道,在数据库效率方面,我是否编辑return\uuuuuunicode\uuuuuu方法并执行如下操作: class AnyModel(models.Model): a_field = models.ForeignKey(A) b_field = models.ForeignKey(B) def __unicode__(self): return "A - B: %s - %s " % (self.a_field.a2.a3, self.b_fie
\uuuuuunicode\uuuuuu
方法并执行如下操作:
class AnyModel(models.Model):
a_field = models.ForeignKey(A)
b_field = models.ForeignKey(B)
def __unicode__(self):
return "A - B: %s - %s " % (self.a_field.a2.a3, self.b_field.b2.b3)
因此,\uuuuuuunicode\uuuuu
方法将命中外键的外键,获取一个字符串,然后返回它
太贵了吗?我应该遵循什么标准?有什么一般性的建议我可以使用吗?最好不要编写这种
\uuuuuunicode\uuuu
方法吗 这就是这种结构所发生的情况:
def __unicode__(self):
return "A - B: %s - %s " % (self.a_field.a2.a3, self.b_field.b2.b3)
点击次数:
(0.000) QUERY = 'SELECT "core_a"."id", "core_a"."a2_id" FROM "core_a" WHERE "core_a"."id" = %s' - PARAMS = (2,); args=(2,)
(0.000) QUERY = 'SELECT "core_a2"."id", "core_a2"."a3_id" FROM "core_a2" WHERE "core_a2"."id" = %s' - PARAMS = (1,); args=(1,)
(0.012) QUERY = 'SELECT "core_a3"."id" FROM "core_a3" WHERE "core_a3"."id" = %s' - PARAMS = (1,); args=(1,)
(0.000) QUERY = 'SELECT "core_b"."id", "core_b"."b2_id" FROM "core_b" WHERE "core_b"."id" = %s' - PARAMS = (1,); args=(1,)
(0.000) QUERY = 'SELECT "core_b2"."id", "core_b2"."b3_id" FROM "core_b2" WHERE "core_b2"."id" = %s' - PARAMS = (1,); args=(1,)
(0.005) QUERY = 'SELECT "core_b3"."id" FROM "core_b3" WHERE "core_b3"."id" = %s' - PARAMS = (1,); args=(1,)
但是,如果你这样做
def __unicode__(self):
a_relation = AnyModel.objects.select_related('a_field__a2__a3').get(pk=self.pk)
b_relation = AnyModel.objects.select_related('b_field__b2__b3').get(pk=self.pk)
return "A - B: %s - %s " % (a_relation.a_field.a2.a3, b_relation.b_field.b2.b3)
执行该行时:
a_relation = AnyModel.objects.select_related('a_field__a2__a3').get(pk=self.pk)
1击:
(0.000) QUERY = 'SELECT "core_anymodel"."id", "core_anymodel"."a_field_id", "core_anymodel"."b_field_id", "core_a"."id", "core_a"."a2_id", "core_a2"."id", "core_a2"."a3_id", "core_a3"."id" FROM "core_anymodel" INNER JOIN "core_a" ON ( "core_anymodel"."a_field_id" = "core_a"."id" ) INNER JOIN "core_a2" ON ( "core_a"."a2_id" = "core_a2"."id" ) INNER JOIN "core_a3" ON ( "core_a2"."a3_id" = "core_a3"."id" ) WHERE "core_anymodel"."id" = %s' - PARAMS = (1,); args=(1,)
当执行第二行时:
b_relation = AnyModel.objects.select_related('b_field__b2__b3').get(pk=self.pk)
+1击:
(0.000) QUERY = 'SELECT "core_anymodel"."id", "core_anymodel"."a_field_id", "core_anymodel"."b_field_id", "core_b"."id", "core_b"."b2_id", "core_b2"."id", "core_b2"."b3_id", "core_b3"."id" FROM "core_anymodel" INNER JOIN "core_b" ON ( "core_anymodel"."b_field_id" = "core_b"."id" ) INNER JOIN "core_b2" ON ( "core_b"."b2_id" = "core_b2"."id" ) INNER JOIN "core_b3" ON ( "core_b2"."b3_id" = "core_b3"."id" ) WHERE "core_anymodel"."id" = %s' - PARAMS = (1,); args=(1,)
什么时候执行
return "A - B: %s - %s " % (self.a_field.a2.a3, self.b_field.b2.b3)
不会命中数据库。
。
1-编辑
您可以加入此,以:
def __unicode__(self):
relation = AnyModel.objects.select_related('a_field__a2__a3', 'b_field__b2__b3').get(pk=self.pk)
return "A - B: %s - %s " % (relation.a_field.a2.a3, relation.b_field.b2.b3)
而且只会击中一次
(0.000) QUERY = 'SELECT "core_anymodel"."id", "core_anymodel"."a_field_id", "core_anymodel"."b_field_id", "core_a"."id", "core_a"."a2_id", "core_a2"."id", "core_a2"."a3_id", "core_a3"."id", "core_b"."id", "core_b"."b2_id", "core_b2"."id", "core_b2"."b3_id", "core_b3"."id" FROM "core_anymodel" INNER JOIN "core_a" ON ( "core_anymodel"."a_field_id" = "core_a"."id" ) INNER JOIN "core_a2" ON ( "core_a"."a2_id" = "core_a2"."id" ) INNER JOIN "core_a3" ON ( "core_a2"."a3_id" = "core_a3"."id" ) INNER JOIN "core_b" ON ( "core_anymodel"."b_field_id" = "core_b"."id" ) INNER JOIN "core_b2" ON ( "core_b"."b2_id" = "core_b2"."id" ) INNER JOIN "core_b3" ON ( "core_b2"."b3_id" = "core_b3"."id" ) WHERE "core_anymodel"."id" = %s' - PARAMS = (1,); args=(1,)
在这里,您可以看到有关select_的文档,感谢您的完整回答。我会接受的。还有一个问题,你认为只做一次连接和点击值得吗?我更喜欢只点击一次。