【问题标题】:adding many to many relations is producing an empty queryset添加多对多关系会产生一个空查询集
【发布时间】:2021-06-11 02:18:01
【问题描述】:

我有一个名为 Occurrence 的模型,它有许多外键和多对多关系(我在这里只展示了几个字段)。在我使用 sqlalchemy 引擎将批量数据加载到我的 postgres (postgis) 数据库后,尝试创建与 Occurrence 实例的任何多对多关系时遇到问题。在上传数据之前,我可以像往常一样建立关系:

Occurrence.objects.get(ind='1010106').minmat.add(Material.objects.get(code='Li'))

然后我检查关系是否成功:

Occurrence.objects.get(ind='1010106').minmat.all()

它返回所有关系的查询集。 我已经删除了数据库,并且在重新迁移后一切正常,但是一旦我重新加载了由多达 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 的所有其他方面都照常工作。

我已经在这个问题上停留了一段时间,所以任何帮助都将不胜感激

【问题讨论】:

  • 你能告诉我们什么是 minmat,我在你分享的模型上看不到吗?
  • 抱歉,刚刚修复了模型。 @Monata

标签: sql django pandas postgresql geodjango


【解决方案1】:

因此,问题与 django 管理的自动创建多对多通过表的自动递增 id 列有关。对于上面的 minmat 字段,此表称为 gp_occurrence_minmat('gp' 是应用程序名称)。自动创建的表有三个字段; id、occurrence_id 和 material_id。 id 字段是一个自动递增字段,这就是我的问题所在。我正在使用带有这三列的 pandas 生成表,然后使用 to_sql 命令将其加载到数据库中。执行此操作时不会出现错误,查询数据时也不会出现问题,但是,如上所述,尝试添加新关系时会出现问题。 我通过删除这些表的 id 列解决了这个问题,并将数据帧加载到 db 中,其中只有occurren_id 和 material_id 列。 sql 自动生成 id 列,然后我能够成功地使用 add() 方法添加关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    相关资源
    最近更新 更多