'django migrations issues with postgres

I'm working on a Django project which dockerized and using Postgres for the database, but we are facing migrations issues, every time someone made changes in the model so if the other dev took a pull from git and try to migrate the migrations using python manage.py migrate because we already have the migrations file so sometimes the error is table already exists or table doesn't exists so every time I need to apply migrations using --fake but I guess that's not a good approach to migrate every time using --fake flag.

docker-compose.yml

version: "3.8"
   
services:
  db:
    container_name: db
    image: "postgres"
    restart: always
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    env_file:
      - dev.env
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=POSTGRES_DB
      - POSTGRES_USER=POSTGRES_USER
      - POSTGRES_PASSWORD=POSTGRES_PASSWORD

  app:
    container_name: app
    build: 
      context: .
    command: bash -c "python manage.py runserver 0.0.0.0:8000"
    volumes:
      - ./core:/app
      - ./data/web:/vol/web
    env_file:
      - dev.env
    ports:
      - "8000:8000"
    depends_on:
      - db

volumes:
  postgres_data:

Dockerfile

FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

WORKDIR /app
EXPOSE 8000

COPY ./core/ /app/
COPY ./scripts /scripts

# installing nano and cron service
RUN apt-get update
RUN apt-get install -y cron
RUN apt-get install nano

RUN pip install --upgrade pip
COPY requirements.txt /app/

# install dependencies and manage assets
RUN pip install -r requirements.txt && \
    mkdir -p /vol/web/static && \
    mkdir -p /vol/web/media

# files for cron logs
RUN mkdir /cron
RUN touch /cron/django_cron.log

# start cron service
RUN service cron start
RUN service cron restart

RUN chmod +x /scripts/run.sh

CMD ["/scripts/run.sh"]

run.sh

#!/bin/sh

set -e

ls -la /vol/
ls -la /vol/web

whoami

python manage.py collectstatic --noinput
python manage.py migrate
service cron start 
service cron restart
python manage.py crontab add 
printenv > env.txt
cat /var/spool/cron/crontabs/root >> env.txt
cat env.txt > /var/spool/cron/crontabs/root 

uwsgi --socket :9000 --workers 4 --master --enable-threads --module alectify.wsgi


Solution 1:[1]

Django offers the ability to create updated migrations when the models change see https://docs.djangoproject.com/en/4.0/topics/migrations/#workflow for more information, but you can generate then apply updated migrations using:

python manage.py makemigrations
python manage.py migrate

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 D. Smith