【问题标题】:How to obtain an object from a queryset of another object list in django如何从 django 中另一个对象列表的查询集中获取对象
【发布时间】:2019-04-23 15:00:51
【问题描述】:

我正在用 django 开发一个项目,但我遇到了一个小问题。

我正在尝试从另一个对象的 querySet 中获取一个数组。尝试获取具有“carro_det.id_articulo_fk”字段的“articulo”,并将其发送到我的模板上下文:

但在 querySet 中我收到错误“int() 参数必须是字符串、类似字节的对象或数字,而不是 'Articulo'”

具体在一行:articulo[i]=Articulo.objects.get(pk=carro_det[i].id_articulo_fk)

这是我的观点.py:

def index(request, id_user):
    carro=Carro.objects.get(id_usuario_fk=id_user)
    carro_det=Carro_det.objects.filter(id_articulo_fk=carro.id)

    #HERE IS THE PROBLEM

    for i in range(len(carro_det)):
        articulo[i]=Articulo.objects.get(pk=carro_det[i].id_articulo_fk)
    contexto = {'articulo':articulo,
                'carro_det':carro_det}
    return render(request, 'cart/cart.html', contexto)

这是来自我的 models.py,你可以在这里看到一切都很好:

class Carro(models.Model):

    total = models.FloatField(default=0, null=True, blank=True)
    #llaves foraneas
    id_usuario_fk=models.ForeignKey('myuser.Usuario', null=True, blank=True, on_delete=models.CASCADE, db_column='id_usuario_fk')


    def __str__(self):
        return "id_carro_cliente: " + str(self.id)

class Carro_det(models.Model):
    cantidad = models.IntegerField(default=0)
    precio_venta = models.FloatField(default=0)
    total = models.FloatField(default=0)
    #llaves foraneas
    id_carro_fk=models.ForeignKey('Carro', null=True, blank=True, on_delete=models.CASCADE, db_column='id_carro_fk')    
    id_articulo_fk=models.ForeignKey('article.Articulo', on_delete=models.CASCADE, db_column='id_articulo_fk')

    def __str__(self):
        return "numero de carro asociado: " + str(self.id_carro_fk.pk)

希望有人能帮帮我,谢谢!

【问题讨论】:

    标签: python django function


    【解决方案1】:

    这两个属性:

    id_carro_fk=models.ForeignKey('Carro', null=True, blank=True, on_delete=models.CASCADE, db_column='id_carro_fk')    
    id_articulo_fk=models.ForeignKey('article.Articulo', on_delete=models.CASCADE, db_column='id_articulo_fk')
    

    是不是 PK 的对象,即使您是这样标记它们的。你可以这样做:

    articulo[i]=Articulo.objects.get(pk=carro_det[i].id_articulo_fk.pk)  # notice the .pk at the end
    

    但这不是这里真正的问题。看来您需要更仔细地阅读有关关系的 django 文档。当您可以访问相关属性时,您似乎正在通过进行这 2 个查询来访问 Carro 实例的所有相关 Carro_det 对象。

    在 django 中声明 ForeignKey 字段时,您正在直接访问相关对象,而 django 在幕后创建了 id 字段。这种关系可以通过以下方式在另一(多)方访问:

    RelatedModel.FKmodel_set
    

    或者如果这样指定:

    class Carro(Model):
        field = ForeignKey('Model', related_name='related_fields', ...)
    

    然后:

    # Carro_det instance
    instance.related_fields  # this accesses all carros related to this carro_det
                             # but this is a queryset you can filter down further, it is fetched lazily
    

    或者在你的情况下:

    carro_instance.carro_det_set
    

    而不是你正在做的方式......

    【讨论】:

      【解决方案2】:

      carro_det[i].id_articulo_fk 正在返回外键(Articulo) 实例。相反,您需要使用id_articulo_fk_id,它是Articulo 实例的实际pk

      用途:

      articulo[i]=Articulo.objects.get(pk=carro_det[i].id_articulo_fk_id)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-05
        • 2018-07-09
        • 1970-01-01
        • 2019-09-02
        • 1970-01-01
        • 2023-03-21
        • 2021-10-25
        相关资源
        最近更新 更多