【问题标题】:No such column: AGC.id Django没有这样的列:AGC.id Django
【发布时间】:2021-11-07 03:22:10
【问题描述】:

我一直在使用现有的数据表,因此我使用inspectdb 创建模型。我的班级没有主键,所以当我makemigrationsmigrate 时,Django 添加了一个名为id 的自动主键。后来我定义了模板、视图和url,在我的网站上查看类表时,出现这样的错误:

没有这样的列:AGC.id

我不知道如何解决它,我是使用 Django 的新手。

型号:

class Agc(models.Model):
    index = models.BigIntegerField(blank=True, null=True)
    area = models.TextField(db_column='AREA', blank=True, null=True)  # Field name made lowercase.
    periodo = models.BigIntegerField(db_column='PERIODO', blank=True, null=True)  # Field name made lowercase.
    demanda = models.TextField(db_column='DEMANDA', blank=True, null=True)  # Field name made lowercase. This field type is a guess.

class Meta:
    db_table = 'AGC'

模板:

{% extends "despachowebapp/Base.html" %}

{% load static %}
{% block content %}
<table class="table table-bordered">
    <thead>
        <tr>
            <th scope="col">#</th>
            <th scope="col">Index</th>
            <th scope="col">Area</th>
            <th scope="col">Periodo</th>
            <th scope="col">Demanda</th>
        </tr>
    </thead>  
    <tbody>
    {% if AGCs %}
        {% for AGC in AGCs  %}
            <tr>
                <th scope='row'>{{ Agc.id }}</th>
                <td>{{ Agc.index }}</td>
                <td>{{ Agc.index }}</td>
                <td>{{ Agc.area }}</td>
                <td>{{ Agc.periodo }}</td>
                <td>{{ Agc.demanda }}</td>
            </tr>
        {% endfor %}
    {% else %}
        <h1>No hay datos </h1>
    </tbody>
</table>
{% endblock %}

观看次数:

def index(request):
    AGCs=Agc.objects.all()
    contexto={'AGCs': AGCs }
    return render(request,'OfertasAGC.html', contexto)

网址:

urlpatterns =[
    path('admin/', admin.site.urls),
    path('', include('webapp.urls')),
    path('prueba/',views.index),
]

【问题讨论】:

  • 请发布完整的回溯。

标签: django sqlite django-models operationalerror


【解决方案1】:

Django 模型必须始终有一个主键,您可以使用 AutoField 或 BigAutoField 或使用其他模型字段,但您需要添加 primary_key = True 属性。

例如:

class Agc(models.Model):
    index = models.BigIntegerField(primary_key=True)
    area = models.TextField(db_column='AREA', blank=True, null=True)  # Field name made lowercase.
    periodo = models.BigIntegerField(db_column='PERIODO', blank=True, null=True)  # Field name made lowercase.
    demanda = models.TextField(db_column='DEMANDA', blank=True, null=True)  # Field name made lowercase. This field type is a guess.
    
    class Meta:
       db_table = 'AGC'
        

【讨论】:

  • 如果不指定主键,Django会自动创建一个名称为id:docs.djangoproject.com/en/3.2/topics/db/models/…
  • 是的,但在他的数据库中不存在该字段,他需要创建它或使用另一个现有字段作为主键。
  • 不,通常迁移会创建一个 id 字段。此外,明确指定它没有区别,或者让 Django 创建名为 id 的主键字段。
  • 当我在索引中插入 primary_key=True 时出现另一个错误,该错误表示删除主键或设置主键 Null=False。所以我不知道该怎么办
  • 错误:webapp.Agc.index: (fields.E007) 主键不能有 null=True。提示:在字段上设置 null=False,或删除 primary_key=True 参数。
猜你喜欢
  • 2021-04-03
  • 2021-11-13
  • 2015-02-25
  • 2020-08-16
  • 2014-09-23
  • 1970-01-01
  • 2020-12-10
  • 2015-12-07
  • 2019-05-20
相关资源
最近更新 更多