Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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
Database 从多对多对象获取所有实例名称?_Database_Django - Fatal编程技术网

Database 从多对多对象获取所有实例名称?

Database 从多对多对象获取所有实例名称?,database,django,Database,Django,我尝试使用以下代码查询数据库: Makesite.objects.values_list('ref_id', flat =True) 它返回[1,2,无]。我发现这有点让人困惑。我假设python以实例自己的名称保存实例,而不是仅分配给它们的数字。任何代码方面的帮助或解释python为什么将它们保存为数字而不是名称都将是非常棒的,谢谢 在models.py中 class Makesite(models.Model): sitename = models.CharField(max_le

我尝试使用以下代码查询数据库:

Makesite.objects.values_list('ref_id', flat =True)
它返回[1,2,无]。我发现这有点让人困惑。我假设python以实例自己的名称保存实例,而不是仅分配给它们的数字。任何代码方面的帮助或解释python为什么将它们保存为数字而不是名称都将是非常棒的,谢谢

在models.py中

class Makesite(models.Model):
    sitename = models.CharField(max_length=100, unique = True) 
    siteinfo = models.ManyToManyField(Siteinfo)
    ref_id = models.ManyToManyField(RefID)
    report = models.ManyToManyField(Report)

Django不会用他们的“名字”来保存m2m。它使用它们的主键(在您的例子中是整数)。您可以通过查看数据库表来检查它

当您仅仅使用类似于
makesite.sitename的东西时,Django会进行另一个查询以获取sitename实例

但是当您使用
values\u list
时,您不需要额外的查询或联接,这就是Django从单个表返回数据的原因。它能从那里得到的只是一个主键


如果要优化相关查询,请查看/方法或使用缓存。

Makesite
的外观如何。什么是
sitename
field?我在那里扔了一些模型代码,希望这就是你要找的,所以我复制了错误的代码编辑了变量名好的。那么,当我使用这样的代码时,它如何知道要使用哪个实例呢
Makesite.objects.get(sitename=site.ref\u id.values\u list('refid',flat=True)
。其中site是实例的名称。@city它首先进行连接,然后返回连接关系的所有
refid
。是一个很酷的工具,用于检查Django提出的SQL查询。这会让事情更清楚。好的。有没有办法将这些主键转换为实例名?@city
Makesite.objects.get(sitename=site.ref\u id.all()
已经尝试过了。仅返回=site的值。通过更详细的描述,它重新展示了它所包含的内容。不是它的名字。所以,就像它的所有内容一样,它实现了站点的平等性