【问题标题】:Django - database data not showing in application?Django - 数据库数据未显示在应用程序中?
【发布时间】:2015-09-03 12:24:35
【问题描述】:

我有一个名为“flows_db”的数据库,它维护着 2 个表“ingress_flows”和“egress_flows”。我对两个表都做了一个 sqldump,这样我就可以在我的家用电脑上使用这些数据了。所以我使用转储文件在这台计算机上重新创建表,我可以看到数据在那里,因为select COUNT(*) from ingress_flows; 显示大约有 2000 个条目。

然后我使用python manage.py inspectdb 从表中创建模型。为了测试它是否有效,我尝试获取一个包含表中所有条目的对象:

views.py:

ingress_all = IngressFlows.objects.all()
context = {
           'ingress_all': ingress_all,
            }
return render(request, 'visualise/index.html', context)     

index.html:

{% if ingress_all %}
    {% for flow in ingress_all %}
        <script>
            console.log("{{ flow.protocol }}");
        </script>
    {% endfor %}
{% else %}
    <p>No data is available.</p>
{% endif %}

但我看到的只是No data is available.。所以对于 Django 来说,我的数据库似乎是空的,即使我使用了包含原始数据库中所有数据的 INSERT 语句的转储文件:

INSERT INTO `ingress_flows` VALUES (1434506151,1434506151,'UDP',48,'ff:ff:ff:ff:ff:ff','10.30.150.100','10.30.191.255',137,137,1024,102400),...

python manage.py shell:

>>> from visualise.models import IngressFlows
>>> IngressFlows.objects.all()
[]
>>> 

但是我可以手动插入一个对象:

>>> t = IngressFlows(time_start=1434506151,time_end=1434506151,protocol='UDP',inf_in=48,mac_dst='ff:ff:ff:ff:ff:ff',ip_src='10.30.150.100',ip_dst='10.30.191.255',port_src=137,port_dst=137,packets_in=1024,bytes_in=102400)
>>> t.save()
>>> IngressFlows.objects.all()
[<IngressFlows: 1434506151, 1434506151, UDP,    48:ff:ff:ff:ff:ff:ff:10.30.150.100:10.30.191.255,   137:137,    1024,   102400>]
>>> 

Django 是否维护自己的数据库,而不是使用系统上的原始 MySQL 数据库?如果是这样,这如何适用,因为它不使用其他应用程序正在更新的系统范围的数据库? Django 是如何看待这些变化的:

谢谢。

settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'mysql.connector.django',
        'NAME': 'flows_db',
        'USER': 'root',
        'PASSWORD': 'dbroot',
        'OPTIONS': {
          'autocommit': True,
        },        
    }
}

【问题讨论】:

  • 您使用的是什么数据库?您是否在 Django 设置中设置了数据库配置?如果没有,Django 使用 Sqlite 作为默认值。
  • 我正在使用 MySQL 数据库。我在上面添加了我的settings.py 配置。谢谢。
  • 您的机器上是否有超过 1 个数据库服务器?当您从 Django shell 添加行时,它是否显示在 select COUNT(*) from ingress_flows; 上?
  • 我的机器上只有一个数据库。不,select 语句没有反映在 Django shell 中所做的更改,但我刚刚注意到有两个新表,分别名为 visualise_ingressflows 和 @ 987654338@。所以 Django 已经决定更改表名了?为什么不使用原始表格?
  • 所以迁移正在创建新表,而我希望他们使用系统上现有的 MySQL 表。

标签: python mysql django


【解决方案1】:

很高兴您发现了问题。您需要为您的 Django 模型设置数据库名称。 https://docs.djangoproject.com/en/1.8/ref/models/options/#db-table

class IngressFlow(models.Model):
    class Meta:
        db_table = 'ingress_flow'

【讨论】:

  • 感谢您的帮助。我添加了:class Meta: managed = False db_table = 'ingress_flow' app_label = '',但是当我运行python manage.py makemigrations visualise 时,它仍然尝试创建表visualise_ingressflow
  • 尝试删除 app_label
  • 是的,谢谢。我认为app_label 意味着表名前面没有任何内容,但显然不是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多