从sqlite迁移到Postgres(django)时如何更新单元测试 - python

我有一个带有许多视图/模型的较大的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…