添加多对多关系会产生一个空的查询集
adding many to many relations is producing an empty queryset
我有一个名为 Occurrence 的模型,其中包含许多外键和多对多关系(我在这里只显示了几个字段)。在我使用 sqlalchemy 引擎将批量数据加载到我的 postgres (postgis) 数据库后,尝试创建与 Occurrence 实例的任何多对多关系时遇到问题。在上传数据之前,我可以像往常一样建立关系:
Occurrence.objects.get(ind='1010106').minmat.add(Material.objects.get(code='Li'))
然后我检查关系是否成功:
Occurrence.objects.get(ind='1010106').minmat.all()
其中 returns 所有关系的查询集。
我已经删除了数据库,并且在新的迁移之后一切正常,但是一旦我重新加载由多达 150,000 行的表组成的数据,我就无法再创建这些关系。没有错误发生,但是在 运行 add().
之后没有对模型实例疯狂添加
这是模型:
class Occurrence(models.Model):
ind = models.CharField(max_length=14, blank=False, null=False, primary_key=True)
minmat = models.ManyToManyField(Material, related_name="minmat_occurrence", blank=True,)
geom = models.PointField(srid=4202)
def __str__(self):
return self.ind
class Material(models.Model):
code = models.CharField(max_length=6, primary_key=True)
name = models.CharField(max_length=50, blank=False, null=False)
category = models.ManyToManyField(MaterialCategory, related_name="category_material", blank=True)
def natural_key(self):
return self.name
在加载数据之前一切正常,所以我认为问题在于在 django 外部加载数据,但 django 的所有其他方面都照常工作。
我已经在这个问题上停留了一段时间,所以非常感谢任何帮助
因此,该问题与通过 table 由 django 管理的自动创建的多对多自动递增 id 列有关。对于上面的 minmat 字段,此 table 称为 gp_occurrence_minmat('gp' 是应用程序名称)。自动创建的 table 有三个字段;编号,occurrence_id & material_id。 id 字段是一个自动递增字段,这就是我的问题所在。我用这三列生成 table 和 pandas,然后用 to_sql 命令将它加载到数据库中。这样做时不会出现错误,查询数据时也不会出现问题,但是,如上所述,在尝试添加新关系时会出现问题。
我通过删除这些 table 的 id 列并仅使用 occurren_id 和 material_id 列将数据帧加载到数据库来解决了这个问题。 sql 自动生成 id 列,然后我可以成功地使用 add() 方法添加关系。
我有一个名为 Occurrence 的模型,其中包含许多外键和多对多关系(我在这里只显示了几个字段)。在我使用 sqlalchemy 引擎将批量数据加载到我的 postgres (postgis) 数据库后,尝试创建与 Occurrence 实例的任何多对多关系时遇到问题。在上传数据之前,我可以像往常一样建立关系:
Occurrence.objects.get(ind='1010106').minmat.add(Material.objects.get(code='Li'))
然后我检查关系是否成功:
Occurrence.objects.get(ind='1010106').minmat.all()
其中 returns 所有关系的查询集。 我已经删除了数据库,并且在新的迁移之后一切正常,但是一旦我重新加载由多达 150,000 行的表组成的数据,我就无法再创建这些关系。没有错误发生,但是在 运行 add().
之后没有对模型实例疯狂添加这是模型:
class Occurrence(models.Model):
ind = models.CharField(max_length=14, blank=False, null=False, primary_key=True)
minmat = models.ManyToManyField(Material, related_name="minmat_occurrence", blank=True,)
geom = models.PointField(srid=4202)
def __str__(self):
return self.ind
class Material(models.Model):
code = models.CharField(max_length=6, primary_key=True)
name = models.CharField(max_length=50, blank=False, null=False)
category = models.ManyToManyField(MaterialCategory, related_name="category_material", blank=True)
def natural_key(self):
return self.name
在加载数据之前一切正常,所以我认为问题在于在 django 外部加载数据,但 django 的所有其他方面都照常工作。
我已经在这个问题上停留了一段时间,所以非常感谢任何帮助
因此,该问题与通过 table 由 django 管理的自动创建的多对多自动递增 id 列有关。对于上面的 minmat 字段,此 table 称为 gp_occurrence_minmat('gp' 是应用程序名称)。自动创建的 table 有三个字段;编号,occurrence_id & material_id。 id 字段是一个自动递增字段,这就是我的问题所在。我用这三列生成 table 和 pandas,然后用 to_sql 命令将它加载到数据库中。这样做时不会出现错误,查询数据时也不会出现问题,但是,如上所述,在尝试添加新关系时会出现问题。 我通过删除这些 table 的 id 列并仅使用 occurren_id 和 material_id 列将数据帧加载到数据库来解决了这个问题。 sql 自动生成 id 列,然后我可以成功地使用 add() 方法添加关系。