这是我的模型:
class Proveedores(models.Model):
idproveedor=models.AutoField(primary_key=True)
nombre= models.CharField(max_length=30)
direccion=models.CharField(max_length=50)
telefono =models.IntegerField()
email= models.CharField(max_length=30)
class Compras(modesl.Model):
idcompra=models.AutoField(primary_key=True)
idproveedor= models.ForeignKey(proveedores,on_delete=models.CASCADE,)
producto= models.ChartField(max_length=30)
costo= models.FloatField()
fecha = models.DateField()
我能做的最接近的是实现sql
它,如图所示:
In [7]: from django.db import connection
In [8]: datos = connection.cursor()
In [9]: datos.execute("select entronque1_proveedores.nombre, entronque1_compras.* from entronque1_proveedores, entronque1_proveedores.idproveedor = entronque1_compras.idproveedor_id")
Out[9]: 3
In [10]: datosOpt = datos.fetchall()
In [11]: datos
Out[11]: <django.db.backends.utils.CursorDebugWrapper at 0xb502846c>
In [12]: datosOpt
Out[12]:
(('pesi', 1, 'pepsi-cola', 34.0, datetime.date(2016, 2, 12), 5),
('coca', 7, 'fanta', 7.0, datetime.date(2016, 1, 11), 3),
('pesi', 8, 'mirinida', 5.0, datetime.date(2016, 1, 19), 5))
虽然我得到了数据,但我不能像在使用Tabla.objects.filter()
.
有什么方法可以改进我的查询以便能够更轻松地访问数据?例如tabla.id
或tabla
。
Si tienes acceso a un
proveedor
, puedes usar la relación inversa :但在我看来,最简单的事情是您只需迭代
Compras
并由提供者订购:奖金:
您可以在视图中使用最后一个示例:
在以下之一
<table></table>
中mis_compras.html
:建议:
模型中的类名应以大写字母开头:
模型名称应该是单数的(例如,当使用以下模型时,它会实例化一个 person,而不是多个):
除非必要,您不需要在模型中创建自己的外键:
我认为在不增加查询次数的情况下使用 Django 的 orm 进行查询的最佳方法是使用select_related()通过 FK 在两个模型之间进行内部连接。
例子:
无论如何,我认为没有必要将 idproviders 添加到模型中,因为 Django 将对象映射到对象;我的意思是模型可能看起来像这样:
Django 会自动生成 id,它们就在那里,但你不需要定义它们。同样,要连接表,无需指定 id 并将其正确传递给完整的对象过滤器: