Django doesn’t see relation in workflow tests

In normal tests running locally, but if I try to run them through workflows I get an error:

Run chmod +x tests/test.sh
Traceback (most recent call last):
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/site-packages/django/db/backends/utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedTable: relation "tours_data.city" does not exist
LINE 1: ...ntry_id", "tours_data"."city"."point"::bytea FROM "tours_dat...
                                                             ^


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/runner/work/tours_manager/tours_manager/manage.py", line 22, in <module>
    main()
  File "/home/runner/work/tours_manager/tours_manager/manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line
    utility.execute()
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/site-packages/django/core/management/__init__.py", line 420, in execute
    django.setup()
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/site-packages/django/apps/registry.py", line 124, in populate
    app_config.ready()
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/site-packages/django/contrib/admin/apps.py", line 27, in ready
    self.module.autodiscover()
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/site-packages/django/contrib/admin/__init__.py", line 50, in autodiscover
    autodiscover_modules("admin", register_to=site)
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/site-packages/django/utils/module_loading.py", line 58, in autodiscover_modules
    import_module("%s.%s" % (app_config.name, module_to_search))
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/home/runner/work/tours_manager/tours_manager/manager/admin.py", line 5, in <module>
    from .forms import AddressForm, ReviewForm
  File "/home/runner/work/tours_manager/tours_manager/manager/forms.py", line 40, in <module>
    class FindToursForm(forms.Form):
  File "/home/runner/work/tours_manager/tours_manager/manager/forms.py", line 43, in FindToursForm
    country_choice_list += [(city.country.id, city.country.name) for city in city_objects]
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/site-packages/django/db/models/query.py", line 394, in __iter__
    self._fetch_all()
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/site-packages/django/db/models/query.py", line 1867, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/site-packages/django/db/models/query.py", line 87, in __iter__
    results = compiler.execute_sql(
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/site-packages/django/db/models/sql/compiler.py", line 1398, in execute_sql
    cursor.execute(sql, params)
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/site-packages/django/db/backends/utils.py", line 102, in execute
    return super().execute(sql, params)
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/site-packages/django/db/backends/utils.py", line 67, in execute
    return self._execute_with_wrappers(
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/site-packages/django/db/backends/utils.py", line 80, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/site-packages/django/db/backends/utils.py", line 84, in _execute
    with self.db.wrap_database_errors:
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/site-packages/django/db/utils.py", line 91, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/opt/hostedtoolcache/Python/3.10.12/x64/lib/python3.10/site-packages/django/db/backends/utils.py", line 89, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "tours_data.city" does not exist
LINE 1: ...ntry_id", "tours_data"."city"."point"::bytea FROM "tours_dat...

Django complains about the following construction inside forms.py:

class FindToursForm(forms.Form):
    country_choice_list, city_choice_list = [('', '')], [('', '')]
    city_objects = City.objects.all()
    country_choice_list += [(city.country.id, city.country.name) for city in city_objects]
    city_choice_list += [(city.id, city.name) for city in city_objects]
    country = forms.ChoiceField(choices=country_choice_list, required=True)
    city = forms.ChoiceField(choices=city_choice_list, required=True)

Namely, on the line country_choice_list += [(city.country.id, city.country.name) for city in city_objects]

pylint.yml:

name: library_app tests
on: [push]
jobs:
  container-job:
    name: Tests
    runs-on: ubuntu-latest
    services:
      postgres:
        image: postgis/postgis
        env:
          POSTGRES_PASSWORD: test
          POSTGRES_DBNAME: postgres
          POSTGRES_USER: test
          POSTGRES_PORT: 5432
          POSTGRES_HOST: 127.0.0.1
        ports:
        - 5432:5432
    steps:
    - uses: actions/checkout@v2
    - name: Install Python
      uses: actions/setup-python@v2
      with:
        python-version: "3.10.12"
    - name: Install modules and dependencies
      run: |
        sudo apt-add-repository ppa:ubuntugis/ubuntugis-unstable
        sudo apt-get update
        sudo apt-get install gdal-bin libgdal-dev
        pip install GDAL==3.6.4
        python -m pip install --upgrade pip
        pip install -r tests/requirements.txt
    - name: API tests
      run: |
        chmod +x tests/test.sh
        ./tests/test.sh tests.test_api

runner.py:

"""Database setup."""

from types import MethodType
from typing import Any

from django.db import connections
from django.db.backends.base.base import BaseDatabaseWrapper
from django.test.runner import DiscoverRunner


def prepare_db(self):
    """Create database schema.

    Args:
        self: type - class object.

    """
    self.connect()
    self.connection.cursor().execute('CREATE SCHEMA IF NOT EXISTS tours_data;')


class PostgresSchemaRunner(DiscoverRunner):
    """Run table schema."""

    def setup_databases(self, **kwargs: Any) -> list[tuple[BaseDatabaseWrapper, str, bool]]:
        """Pre-setup database for work.

        Args:
            kwargs: Any - key word arguments.

        Returns:
            list[tuple[BaseDatabaseWrapper, str, bool]]: setupped database.
        """
        for conn_name in connections:
            connection = connections[conn_name]
            connection.prepare_database = MethodType(prepare_db, connection)
        return super().setup_databases(**kwargs)

Yes, it is 100% listed in settins.py

tests.sh:

export DJANGO_SECRET_KEY="django-insecure-pt4!7*d%-dn)&lx6@598y(1!!rljgaieunnwk!n)-#r^ew(dcb"
export PG_HOST=127.0.0.1
export PG_PORT=5432
export PG_USER=test
export PG_PASSWORD=test
export PG_DBNAME=postgres
export MINIO_ACCESS_KEY_ID=ULk99g9UwyucWln57ypo
export MINIO_SECRET_ACCESS_KEY=dGKHOvOO9166VEMOO0tSRdUVVUcm5odgYgB2Yfjs
export MINIO_STORAGE_BUCKET_NAME=static
export MINIO_API=http://localhost:9000
export MINIO_CONSISTENCY_CHECK_ON_START=False


python3 manage.py test --verbosity=3 $1

If you need more code let me know.

All the code is here: https://github.com/rTiRe/tours_manager
Folder with initialized django app: manager

I’m guessing the error is that the tests initially check all my code, and it accesses tables that have not yet been created, but I have no idea how to fix it 🙁

Sorry for my English, I still use a translator quite often.

New contributor

ZiEnTenIn is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa
Thiết kế website Thiết kế website Thiết kế website Cách kháng tài khoản quảng cáo Mua bán Fanpage Facebook Dịch vụ SEO Tổ chức sinh nhật