Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 当我将_unicode__)方法的默认返回值更改为传递多个外键时会发生什么_Django_Django Models - Fatal编程技术网

Django 当我将_unicode__)方法的默认返回值更改为传递多个外键时会发生什么

Django 当我将_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

我想知道,在数据库效率方面,我是否编辑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_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_的文档,感谢您的完整回答。我会接受的。还有一个问题,你认为只做一次连接和点击值得吗?我更喜欢只点击一次。