【问题标题】:Inner join in Django 1.9Django 1.9 中的内部连接
【发布时间】:2018-01-07 22:25:05
【问题描述】:

我有这两个模型:

class ModelInteractions(models.Model):
    id1 = models.IntegerField(primary_key=True)
    id2 = models.IntegerField()
    comm = models.TextField(blank=True, null=True)

    class Meta:
        managed = False
        unique_together = (('id1', 'id2'),)


class Models(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.TextField()

    class Meta:
        managed = False

我还想选择comm。在我看来,我使用以下代码从Models获取数据:

condition = Q(name__icontains=names[0])
for name in names[1:]:
    condition &= Q(name__icontains=name)
# ↓↓↓ this line is for what I need but it doesn't work
condition &= Q(ModelInteractions__id2=id)

models = Models.objects.filter(condition)

应请求接收id (def details(request, id):)。

我需要从ModelInteractions 中选择comm,其中id2 = id(根据要求收到ID)。

当前代码返回:

Cannot resolve keyword 'ModelInteractions' into field. Choices are: id, name

【问题讨论】:

  • 你不能在 django 中这样做,你需要和外键有关系,然后你可以使用它,如果你不想提及关系,你可以使用原始查询
  • 你能举个例子吗?

标签: python sql django postgresql django-queryset


【解决方案1】:
class ModelInteractions(models.Model):
    id1 = models.IntegerField(primary_key=True)
    id2 = models.IntegerField()
    comm = models.TextField(blank=True, null=True)

    class Meta:
        managed = False
        unique_together = (('id1', 'id2'),)


class Models(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.TextField()
    interaction= models.ForeignKey(ModelInteractions,on_delete=models.CASCADE)

像这样制作你的模型,然后进行迁移和迁移

然后运行相同的查询直到这里

condition = Q(name__icontains=names[0])
for name in names[1:]:
    condition &= Q(name__icontains=name)

然后改变这一行

condition &= Q(interaction__id2=id)

然后

models = Models.objects.filter(condition)

【讨论】:

  • 谢谢!我应该提供默认值吗?我在迁移时收到了这个django.db.utils.IntegrityError: column "interaction_id" contains null values
  • 可以,对于表中的旧数据,有空值,如果不需要旧数据,可以删除数据库,新建一个并迁移,否则默认=1
猜你喜欢
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 2013-03-22
  • 2018-06-16
  • 2018-10-08
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
相关资源
最近更新 更多