【问题标题】:when in try to access mysql view using django model it throws an error当尝试使用 django 模型访问 mysql 视图时,它会引发错误
【发布时间】:2019-12-12 21:28:02
【问题描述】:

我想使用 django 过滤器访问 mysql 视图中的记录,但它会引发错误

class PartnerPayBillSummaryDetails(models.Model):
    invoice_no = models.CharField(max_length=200)
    invoice_id = models.IntegerField()
    partner_id = models.IntegerField()
    partner_name = models.CharField(max_length=100)
    status = models.CharField(null=False, max_length=50)
    invoice_date = models.DateField()
    bill_received_date = models.DateField()
    due_date = models.DateField()
    due_date_ageing = models.IntegerField()
    payable_amount = models.DecimalField(max_digits=20, decimal_places=2, default=0)

    class Meta:
        managed = False
        db_table = '66_1_partner_pay_bill_ageing_dtl'
try:
    p = PartnerPayBillSummaryDetails.objects.all()
    print(p)
except Exception as e:
    print(e)

错误:

OperationalError: (1054, "Unknown column '66_1_partner_pay_bill_ageing_dtl.id' in 'field list'")

【问题讨论】:

  • 您能分享一下您的PartnerPayBillSummaryDetails 模型和所有相关模型吗?
  • 我在 DB 中创建了一个视图,然后在 django 模型中复制了该视图
  • 我假设具有该名称的表已经在数据库中,并且该表有一个名为“id”的字段。我说的对吗?
  • 是的,我使用 MySQL 查询创建了它,然后我在 django 中复制它而不影响迁移文件,方法是 add managed = False

标签: python mysql django django-models


【解决方案1】:

我想出了答案

它需要一个字段作为主键。我通过添加来解决这个问题 invoice_id 中的“primary_key=True”

invoice_id = models.IntegerField(primary_key=True)

【讨论】:

    【解决方案2】:

    在我看来,它正在寻找一个名为“id”的主键(如果您没有定义,则默认情况下)。您在元类中的 db_table 名称也以数字开头。不确定它是否允许。我不在电脑旁进行测试,但根据猜测,我有两个解决方案给你。请按此顺序试一试。我所做的只是在两个解决方案中更改您的模型类。

    class PartnerPayBillSummaryDetails(models.Model):
        invoice_no = models.CharField(max_length=200)
        invoice_id = models.IntegerField()
        partner_id = models.IntegerField()
        partner_name = models.CharField(max_length=100)
        status = models.CharField(null=False, max_length=50)
        invoice_date = models.DateField()
        bill_received_date = models.DateField()
        due_date = models.DateField()
        due_date_ageing = models.IntegerField()
        payable_amount = models.DecimalField(max_digits=20, decimal_places=2, default=0)
    
        class Meta:
            managed = False
            db_table = 'partner_pay_bill_ageing_dtl_66_1'
    

    解决方案 2

    class PartnerPayBillSummaryDetails(models.Model):
        id = models.AutoField(primary_key=True)
        invoice_no = models.CharField(max_length=200)
        invoice_id = models.IntegerField()
        partner_id = models.IntegerField()
        partner_name = models.CharField(max_length=100)
        status = models.CharField(null=False, max_length=50)
        invoice_date = models.DateField()
        bill_received_date = models.DateField()
        due_date = models.DateField()
        due_date_ageing = models.IntegerField()
        payable_amount = models.DecimalField(max_digits=20, decimal_places=2, default=0)
    
        class Meta:
            managed = False
            db_table = 'partner_pay_bill_ageing_dtl_66_1'
    

    如果还有错误请告诉我。

    【讨论】:

      【解决方案3】:

      您必须为模型添加主键。

      id = models.AutoField(primary_key=True)
      

      或将任何列设为主键,例如:

      invoice_id = models.IntegerField(primary_key=True)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-24
        • 1970-01-01
        • 2013-07-19
        • 2023-01-19
        • 2023-03-13
        • 1970-01-01
        • 2017-07-04
        相关资源
        最近更新 更多