3

Djangoの最小限の作業例を作成しようとしています。これは、メモリ内データベースでモデルを定義およびインスタンス化できるようにする単一のファイルである必要があり、その後、stackoverflow の質問に使用できます。可能であれば、django/unittest フレームワークを使用したいと思います。これにより、モデルの動作の問題を簡単に示すことができるからです。

このようなものを持つことで恩恵を受けるStackoverflowに関する多くの質問があります。

私がこれまでに管理したこと:

# Django Minimal Working Example
# (intended) usage: save as `mwe.py` and run `python mwe.py`

# Settings
from django.conf import settings
settings.configure(DATABASES = {
        'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': ':memory:'}
        })

# Models
# with help from http://softwaremaniacs.org/blog/2011/01/07/django-micro-framework/en/
from django.db import models
import sys

sys.modules['mwe.mwe'] = sys.modules[__name__]
sys.modules[__name__].__name__ = 'mwe.mwe'
__package__ = 'mwe.mwe'

class Book(models.Model):
    isbn = models.IntegerField()

# Make a database and do things to it
from django.utils import unittest
from django.test import TestCase

class TestCreateObjects(TestCase):

    def setUp(self):
        book = Book.objects.create(isbn='9780470467244')

    def test_sanity(self):
        self.assertEqual(Book.objects.count(), 1)

unittest.main()

このスクリプトは unittest を実行するところまで取得しますが、エラーが発生しますdjango.db.utils.DatabaseError: no such table: mwe_book

編集からの行を次のように置き換えてみましたfrom django.utils import unittest:

from django.core.management import call_command
call_command('syncdb', interactive=False)
book = Book.objects.create(isbn='9780470467244')

これにより、上記と同じ DatabaseError が発生する前に、次のフィードバックが返されます。

Creating tables ...
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

まとめPavel の助けのおかげで、これは機能しています。参考までに、スクリプトのコンパクト バージョンから不要なユニットテストを除いたものを次に示します。

# Django Minimal Working Example
#   usage: save as `mwe.py` and run `python mwe.py`

# Setup django with an in-memory sqlite3 database
#   Thanks to Pavel Anossov http://stackoverflow.com/a/15824108/188595
import sys
from django.conf import settings
from django.core.management import call_command
settings.configure(
        DATABASES = {
            'default': {'ENGINE': 'django.db.backends.sqlite3',
                        'NAME': ':memory:'}
        },
        INSTALLED_APPS = ('mwe',),
    )
from django.db import models
sys.modules['mwe.models'] = sys.modules['mwe.mwe'] = sys.modules['mwe'] = sys.modules[__name__]
sys.modules[__name__].__name__ = __package__ = 'mwe.mwe'

# YOUR MODEL DEFINITIONS HERE

class Book(models.Model):
    isbn = models.IntegerField()

# The call_command line has to appear after all model definitions
call_command('syncdb', interactive=False)

# YOUR CODE HERE

Book.objects.create(isbn='9780470467244')
assert Book.objects.count() == 1
4

1 に答える 1

2

あなたが見逃していたのは、実際にアプリをインストールすることです:

settings.configure(
        DATABASES = {
            'default': {'ENGINE': 'django.db.backends.sqlite3',
                        'NAME': ':memory:'}
        },
        INSTALLED_APPS = ('mwe',),
    )

これは、このモジュールも翻訳mwe.modelsによってインポートsyncdbされることを意味します。mwe

sys.modules['mwe.models'] = sys.modules[__name__]
sys.modules['mwe'] = sys.modules[__name__]

私の最終バージョン:

from django.conf import settings
import sys

settings.configure(
        DATABASES = {
            'default': {'ENGINE': 'django.db.backends.sqlite3',
                        'NAME': ':memory:'}
        },
        INSTALLED_APPS = ('mwe',),
    )


from django.core.management import call_command
from django.utils import unittest
from django.db import models
from django.test import TestCase

sys.modules['mwe.models'] = sys.modules[__name__]
sys.modules['mwe.mwe'] = sys.modules[__name__]
sys.modules['mwe'] = sys.modules[__name__]
sys.modules[__name__].__name__ = 'mwe.mwe'
__package__ = 'mwe.mwe'


class Book(models.Model):
    isbn = models.IntegerField()


class TestCreateObjects(TestCase):
    def setUp(self):
        book = Book.objects.create(isbn='9780470467244')

    def test_sanity(self):
        self.assertEqual(Book.objects.count(), 1)

call_command('syncdb', interactive=False)
unittest.main()

$ python mwe.py
Creating tables ...
Creating table mwe_book
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)
.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK

これはいくつかの恐ろしい方法で壊れており、django のバージョンに依存していると確信していますが、試して確認する必要があります。

于 2013-04-05T00:40:16.857 に答える