Skip to main content
 首页 » 编程设计

python之单文件 Django、DRF 项目

2025年05月04日52开发

我正在尝试将 Django 和 Django REST Framework 混合到一个模块中,看看它是否可以工作。到目前为止,我有以下代码:

############################################################################### 
# SETTINGS 
############################################################################### 
import os 
from django.apps import apps 
from django.conf import settings 
 
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) 
 
if not settings.configured: 
    settings.configure( 
        DEBUG=True, 
        SECRET_KEY='thisisthesecretkey', 
        ROOT_URLCONF=__name__, 
        STATIC_URL='/static/', 
        STATICFILES_DIRS=( 
            os.path.join(BASE_DIR, "static"), 
        ), 
        MIGRATION_MODULES = {'__main__': 'migrations'}, 
        MIDDLEWARE_CLASSES=( 
            'django.middleware.common.CommonMiddleware', 
            'django.middleware.csrf.CsrfViewMiddleware', 
            'django.middleware.clickjacking.XFrameOptionsMiddleware', 
        ), 
        DATABASES = { 
            'default': { 
                'ENGINE': 'django.db.backends.sqlite3', 
                'NAME': 'tinydb', 
            } 
        }, 
        INSTALLED_APPS = ( 
            '__main__', 
            'rest_framework', 
            'django.contrib.staticfiles', 
        ), 
    ) 
 
apps.populate(settings.INSTALLED_APPS) 
 
 
############################################################################### 
# MODELS 
############################################################################### 
from django.db import models 
 
 
class Book(models.Model): 
    ISBN = models.AutoField(primary_key=True) 
    author = models.CharField(max_length=100) 
    title = models.CharField(max_length=200) 
    description = models.CharField(max_length=500) 
 
 
############################################################################### 
# SERIALIZERS 
############################################################################### 
from rest_framework import serializers 
 
 
class BookSerializer(serializers.ModelSerializer): 
    class Meta: 
        model = Book 
 
 
############################################################################### 
# VIEWS 
############################################################################### 
class BooksView(): 
    queryset = Book.objects.all() 
    serializer_class = BookSerializer 
 
 
############################################################################### 
# URLCONF 
############################################################################### 
from django.conf.urls import url, include 
from rest_framework.routers import DefaultRouter 
 
 
router = DefaultRouter() 
router.register(r'books', BooksView) 
 
urlpatterns = ( 
    url(r'^$', include(router.urls)), 
) 
 
 
############################################################################### 
# MANAGE 
############################################################################### 
import sys 
 
 
if __name__ == "__main__": 
    from django.core.management import execute_from_command_line 
    execute_from_command_line(sys.argv) 

现在,服务器正在运行,我看到了 API 浏览器。然而,当我尝试创建一个对象时,我得到了以下痕迹:

>>> from __main__ import Book 
>>> Book.objects.create(author='a1', title='t1', description='d1') 
Traceback (most recent call last): 
  File "<console>", line 1, in <module> 
  File "/home/lwm/.virtualenvs/tiny-api/lib/python3.4/site-packages/django/db/models/manager.py", line 127, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
  File "/home/lwm/.virtualenvs/tiny-api/lib/python3.4/site-packages/django/db/models/query.py", line 348, in create 
    obj.save(force_insert=True, using=self.db) 
  File "/home/lwm/.virtualenvs/tiny-api/lib/python3.4/site-packages/django/db/models/base.py", line 734, in save 
    force_update=force_update, update_fields=update_fields) 
  File "/home/lwm/.virtualenvs/tiny-api/lib/python3.4/site-packages/django/db/models/base.py", line 762, in save_base 
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) 
  File "/home/lwm/.virtualenvs/tiny-api/lib/python3.4/site-packages/django/db/models/base.py", line 846, in _save_table 
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) 
  File "/home/lwm/.virtualenvs/tiny-api/lib/python3.4/site-packages/django/db/models/base.py", line 885, in _do_insert 
    using=using, raw=raw) 
  File "/home/lwm/.virtualenvs/tiny-api/lib/python3.4/site-packages/django/db/models/manager.py", line 127, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
  File "/home/lwm/.virtualenvs/tiny-api/lib/python3.4/site-packages/django/db/models/query.py", line 920, in _insert 
    return query.get_compiler(using=using).execute_sql(return_id) 
  File "/home/lwm/.virtualenvs/tiny-api/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 974, in execute_sql 
    cursor.execute(sql, params) 
  File "/home/lwm/.virtualenvs/tiny-api/lib/python3.4/site-packages/django/db/backends/utils.py", line 79, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
  File "/home/lwm/.virtualenvs/tiny-api/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
  File "/home/lwm/.virtualenvs/tiny-api/lib/python3.4/site-packages/django/db/utils.py", line 97, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
  File "/home/lwm/.virtualenvs/tiny-api/lib/python3.4/site-packages/django/utils/six.py", line 658, in reraise 
    raise value.with_traceback(tb) 
  File "/home/lwm/.virtualenvs/tiny-api/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
  File "/home/lwm/.virtualenvs/tiny-api/lib/python3.4/site-packages/django/db/backends/sqlite3/base.py", line 318, in execute 
    return Database.Cursor.execute(self, query, params) 
django.db.utils.OperationalError: no such table: __main___book 

makemigrations 返回:

lwm$ python api.py makemigrations 
No changes detected 

我可以运行迁移:

lwm$ python api.py migrate 
Operations to perform: 
  Synchronize unmigrated apps: __main__, staticfiles, rest_framework 
  Apply all migrations: (none) 
Synchronizing apps without migrations: 
  Creating tables... 
    Running deferred SQL... 
  Installing custom SQL... 
Running migrations: 
  No migrations to apply. 

所以。我想,由于我的 Book 模型没有放在单独的应用程序中,因此没有为它创建数据库表。除了手动创建表(例如,使用 db_table 元字段)之外,我仍然希望获得 ORM 为我做事的所有好处。

有什么想法吗?

请您参考如下方法:

尝试从已安装的应用程序列表中删除 __main__。除非您实际上有一个名为 __main__ 的应用程序(考虑到 double underscores means something in python ,您可能不应该这样做),否则它不应该存在。