我有一个带有许多视图/模型的较大的Django项目。我最近将我的项目从sqlite3迁移到本地的postgres,并计划进一步扩展(将postgres放在单独的机器上,等等)。
从sqlite迁移到postgres时,我遵循了these instructions,它似乎运行得很好。 (即,我正在运行的应用看上去与数据库为sqlite时相同)
我的问题是这样的:当我运行以前编写的单元测试时,第一个单元测试将起作用,并且所有进行中的单元测试都将失败。单独地,单元测试可以正常工作。我在stackoverflow上看到了一些other posts来解决此问题,但是解决方案还不清楚。如何为单元测试重做我的setUp()
/ teardown()
方法,以便它们与我新迁移的postgres db一起传递?我需要完全重写所有单元测试吗?
我已经看过pytest-postgresql library,尽管我不确定如何基于此修改我的单元测试。
我的测试套件设置有测试视图的不同类。例如
class View1Tests(TestCase):
def setUp(self):
c1 = Category.objects.create(id=55555, leaf_node_name="Test Category 1")
c2 = Category.objects.create(id=12345, leaf_node_name="Test Category 2")
s1 = Search.objects.create(category=c1, username="testuser")
s2 = Search.objects.create(category=c2, username="testuser2")
def test_view1_success(self):
#blablabla
def test_view1_fail(self):
#blablabla
def test_view1_something(self):
#blablabla
我收到这样的错误:
appname.models.DoesNotExist:搜索匹配查询不存在。
同样,当sqlite3是数据库时,所有这些单元测试都运行良好。我认为Postgres测试设置有问题吗?但是我不知道该从哪里开始。任何帮助,将不胜感激!!
参考方案
我想我终于找到了问题所在。尝试通过默认主键(例如MyModel.objects.get(pk=1)
,MyModel.objects.get(id=1)
)获取对象时,就会出现问题。我的假设是Postgres使用串行数据类型作为AutoField,增量值取决于Postgres生成的序列。
我发现的解决方案非常简单。通过具有对该对象唯一属性的属性来获取,或者获取所有对象并使用列表索引进行过滤。后一种方法不会太麻烦,因为在大多数情况下,会创建模型的一些实例。
这是一个完整的例子
# models.py
class Book(models.Model):
isbn = models.CharField(
max_length=13,
primary_key=True # uniqueness is enforced
)
book_name = models.CharField(
max_length=128,
unique=True # another unique field
)
author_count = models.IntegerField()
book_genre = models.CharField(max_length=64)
# tests.py
class MyTest(TestCase):
@classmethod
def setUpTestData(cls):
# first object
Book.objects.create(
isbn='10101',
book_name='Binary Code',
author_count=1,
book_genre='Fiction'
)
# second object
Book.objects.create(
isbn='314159',
book_name='Life of Pi',
author_count=1,
book_genre='Philosophy'
)
def setUp(self):
self.book1 = Book.objects.all()[0]
# or self.book1 = Book.objects.get(isbn='10101')
# or self.book1 = Book.objects.get(book_name='Binary Code')
self.book2 = Book.objects.all()[1]
# or self.book2 = Book.objects.get(isbn='314159')
# or self.book2 = Book.objects.get(book_name='Life of Pi')
def test_something(self):
# lastly, since `setUp` is called before every test_* method
# you can just access the instance's attributes without calling `get`
# e.g:
self.assertEqual(self.book1.book_genre, 'Fiction')
def test_something_else(self):
# you an also reload the instance using `refresh_from_db`
# after making changes
Book.objects.filter(author_count=1).update(book_genre='Fiction')
self.book2.refresh_from_db()
self.assertEqual(self.book2.book_genre, 'Fiction')
django-simple-history,在admin中显示更改的字段 - python当我从admin.ModelAdmin继承时,在管理页面的历史记录中,我可以看到哪些字段已更改。但是,现在我需要使用django-simple-history来跟踪所有模型更改。现在,对于管理员,我继承了simple_history.SimpleHistoryAdmin。我可以看到所有模型更改并还原它们,但看不到更改了哪些字段。是否可以在SimpleHist…
Django Python如何在给定两个时间字符串的情况下计算时差 - python在Django Python中,我有2个HH:mm时间字符串,如何获取持续时间(差异)?例如:15:30 and 11:00 ---> difference is 04:30 19:28 and 12:25 ---> difference is 07:03 参考方案 我们可以首先使用以下命令将字符串解析为datetime对象:from datet…
django-compressor未与django-shop一起安装 - python我无法使用django-shop安装django-compressor。出现这样的错误。Failed building wheel for rcssmin ================================= Failed building wheel for rjsmin -----------------------------------…
Django:错误:您无权访问该端口 - python我是整个安装的新手,请保持友善。在dev上,该命令通常可以正常工作,但是自从我尝试使用Django的不同命令以来,某些东西就出错了。python manage.py runserver 0.0.0.0:80 我没有使用此端口的权限了。我可以使用端口8080,但将端口添加到url中通常的主机名末尾时,网站无法正常工作。当我使用端口80时,无论如何我都无需在UR…
Django-一个CBV可处理多种情况 - python我很难理解如何使用单个CBV处理(至少)2种不同情况。这是我想做的事情:我有一个ListView来显示对象列表。从那里,我生成一个链接以导航到DetailView以显示对象的详细信息。从那里,我生成一个链接到呈现相关报告的不同视图。我想使用以下网址:1. /myapp/list.html/ 2. /myapp/detail.html/<<uuid…