【问题标题】:Django 2.1 ProgrammingError at /admin column + _id does not exist/admin 列 + _id 处的 Django 2.1 ProgrammingError 不存在
【发布时间】:2019-07-14 07:15:53
【问题描述】:

在尝试运行我的第二个 Django 2.1 /Postgres 10 项目时,我遇到了以下编程错误:

ProgrammingError at /admin/vocs_app/subsubscriber/

column sub_subscriber.sub_prev_sst_uid_id does not exist
LINE 1: ...", "sub_subscriber"."sub_next_recharge_datetime", "sub_subsc...
                                                             ^
HINT:  Perhaps you meant to reference the column "sub_subscriber.sub_prev_sst_uid".

我可以打开我的应用程序的admin app,即127.0.0.1:8000/admin/vocs_app。 它列出了我数据库中所有导入的模型;为了说明我的情况,我相信以下课程就足够了:

(取自my_site/vocs_app/models.py:)

from django.db import models

class VneVirtualNetwork(models.Model):
    vne_uid = models.BigAutoField(primary_key=True)
    vne_nop_uid = models.ForeignKey(NopNetworkOperator, models.DO_NOTHING, db_column='vne_nop_uid')
    vne_name = models.CharField(max_length=50)
    vne_code = models.CharField(max_length=50)
    vne_external_id = models.CharField(max_length=100, blank=True, null=True)
    vne_idd_code = models.CharField(max_length=5)
    vne_sn_length = models.IntegerField()
    createdon = models.DateTimeField()
    createdby = models.CharField(max_length=150)
    createdfrom = models.CharField(max_length=150)
    modifiedon = models.DateTimeField()
    modifiedby = models.CharField(max_length=150)
    modifiedfrom = models.CharField(max_length=150)

    class Meta:
        managed = False
        db_table = 'vne_virtual_network'

class SstSystemStatus(models.Model):
    sst_uid = models.BigAutoField(primary_key=True)
    sst_name = models.CharField(max_length=50)
    sst_description = models.CharField(max_length=100, blank=True, null=True)
    startdate = models.DateField(blank=True, null=True)
    enddate = models.DateField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'sst_system_status'

class SubSubscriber(models.Model):
    sub_uid = models.BigAutoField(primary_key=True)
    sub_vne_uid = models.ForeignKey('VneVirtualNetwork', models.DO_NOTHING, db_column='sub_vne_uid')
    sub_rpl_uid = models.ForeignKey(RplRatePlan, models.DO_NOTHING, db_column='sub_rpl_uid')
    sub_account_user_id = models.CharField(max_length=100, blank=True, null=True)
    sub_external_id = models.CharField(max_length=100)
    sub_hzn_uid = models.ForeignKey(HznHomezoneName, models.DO_NOTHING, db_column='sub_hzn_uid')
    sub_low_balance_trigger = models.BooleanField()
    sub_first_call_datetime = models.DateTimeField(blank=True, null=True)
    sub_last_enabled_datetime = models.DateTimeField(blank=True, null=True)
    sub_last_disabled_datetime = models.DateTimeField(blank=True, null=True)
    sub_last_recharge_datetime = models.DateTimeField(blank=True, null=True)
    sub_next_recharge_datetime = models.DateTimeField(blank=True, null=True)
    sub_prev_sst_uid = models.ForeignKey(SstSystemStatus, related_name='sub_prev_sst_uid',on_delete=models.DO_NOTHING)
    sub_sst_uid = models.ForeignKey(SstSystemStatus, related_name='sub_sst_uid',on_delete=models.DO_NOTHING)
    startdatetime = models.DateTimeField()
    enddatetime = models.DateTimeField()
    createdon = models.DateTimeField()
    createdby = models.CharField(max_length=150)
    createdfrom = models.CharField(max_length=150)
    modifiedon = models.DateTimeField()
    modifiedby = models.CharField(max_length=150)
    modifiedfrom = models.CharField(max_length=150)

    class Meta:
        managed = False
        db_table = 'sub_subscriber'

class SubSubscriber 引用 表/类 SstSystemStatus外键 sst_uid 两次(以前和当前状态)。似乎 Django 不喜欢它。其他表,例如 VneVirtualNetwork(包含“单个”外键引用)不会引起任何问题。管理 GUI 允许我显示和更改他们的数据。

错误消息显示 Django 尝试用 '_id' 补充字段名称 sub_prev_sst_uid。如果我在文件 model.py 中注释相关行并尝试显示订阅者表,则会导致相同的错误,这次是字段sub_sst_uid。如何防止 Django 附加 '_id'

提前感谢您的任何建议。

【问题讨论】:

    标签: django python-3.x postgresql django-models


    【解决方案1】:

    默认情况下,Django 将使用相关名称和/或选择的类字段名称,添加后缀“_id”并尝试在数据库中找到该名称的列。除非您明确定义 db_column 如下:

    sub_sst_uid = models.ForeignKey('SstSystemStatus', db_column='sub_sst_uid', related_name='sub_sst_uid', on_delete=models.DO_NOTHING)
    
    sub_prev_sst_uid = models.ForeignKey('SstSystemStatus', db_column='sub_prev_sst_uid', related_name='sub_prev_sst_uid', on_delete=models.DO_NOTHING)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2020-02-12
      • 2015-11-01
      • 2018-08-30
      • 2014-10-25
      • 2021-03-09
      • 1970-01-01
      相关资源
      最近更新 更多