比较关系时过滤确切的ID

问题描述 投票:2回答:1

我在比较两个关系时尝试过滤ID,这是我的代码:

楷模:

模型A.

class ModelA(models.Model):
    name = models.CharField(max_length=20)
    def __str__(self):
        return '%s' %(self.id)

模型

class ModelB(models.Model):
    relationship = models.OneToOneField(ModelA)
    def __str__(self):
        return '%s' %(self.relationship)

ModelC

class ModelC(models.Model):
    relationship_A = models.ForeignKey('ModelA', null=True, blank=True)
    relationship_B = models.ForeignKey('ModelB', null=True, blank=True)
    def __str__(self):
        return '%s' %(self.id)

浏览次数:

模型的视图

def RegModelA(request):
        form = ""
        if request.method == "POST":
            form = ModelAForm(request.POST)
            if form.is_valid():
                save = form.save()
                create_modelc = ModelC.objects.create(relationship_A=save, relationship_B=None)
                return redirect('/')
        else:
            form = ModelAForm()
        return render(request, "template.html", {"form":form})

到目前为止的结果如下:

Click to see result


ModelB的视图

def RegModelB(request):
        form = ""
        if request.method == "POST":
            form = ModelBForm(request.POST)
            if form.is_valid():
                save = form.save()
                update_modelc = ModelC.objects.filter().update(relationship_B=save)
                return redirect('/')
        else:
            form = ModelBForm()
        return render(request, "template.html", {"form":form})

我想在qazxsw poi时得到模型的确切ID,以便更新关系B.

我应该如何使用过滤器在ModelB视图中获取该ID?


使用:Python 3.5和Django 1.11

python django
1个回答
2
投票

因此,如果我理解正确,您希望基于relationship_A == save_relationships ModelC属性获得一个或多个ModelA实例。 Django让您查询跨越双下划线运算符id的关系的属性,从而产生以下查询:

__

也就是说,请注意这是一个等待发生的巨大错误。当您在ModelC.objects.filter(relationship_A__id=save.relationship.id) # or ModelC.objects.filter(relationship_A=save.relationship.id) # ModelC.objects.filter(relationship_a=save.relationship) 上使用filter时,您正在查询整个数据库,这可能会导致不必要的行为。如果您有多个ModelC实例,它们具有相同的ModelC实例,而您只想更新最新实例,则会出现这种情况。

© www.soinside.com 2019 - 2024. All rights reserved.