Не создаются поля в БД где есть foreign key

Не создаются поля в БД где есть ForeignKey Вот мой models.py

from django.conf import settings
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.db.models import Sum


USER_TYPE_CHOICES = (
    ("Seller", "Магазин"),
    ("Buyer", "Покупатель"),
)


STATE_CHOICES = (
    ('new', 'Новый'),
    ('confirmed', 'Подтвержден'),
    ('assembled', 'Собран'),
    ('sent', 'Отправлен'),
    ('delivered', 'Доставлен'),
    ('canceled', 'Отменен'),
)


class User(AbstractUser):
    """Модель пользователя"""

    user_type = models.CharField(
        "Тип пользователя",
        max_length=20,
        choices=USER_TYPE_CHOICES,
        blank=False,
        null=False
    )

    class Meta:
        verbose_name = "Пользователь"
        verbose_name_plural = "Список пользователей"

    def __str__(self):
        return f"{self.username}"


class Shop(models.Model):
    """Модель магазина"""

    name = models.CharField("Название", max_length=80)
    url = models.URLField("Ссылка", blank=True, null=True)
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        verbose_name="Пользователь",
        on_delete=models.CASCADE,
        null=True,
        blank=True
    )
    state = models.BooleanField("Статус приёма заказов", default=True)
#   filename

    class Meta:
        verbose_name = "Магазин"
        verbose_name_plural = "Список магазинов"

    def __str__(self):
        return f"{self.name}"


class Category(models.Model):
    """Модель категорий"""

    name = models.CharField("Название", max_length=50)
    shops = models.ManyToManyField(
        Shop,
        verbose_name="Магазин",
        related_name="categories",
        blank=True
    )

    class Meta:
        verbose_name = "Категория"
        verbose_name_plural = "Категории"

    def __str__(self):
        return f"{self.name}"


class Product(models.Model):
    """Модель продукта"""

    name = models.CharField("Название", max_length=80)
    category = models.ForeignKey(
        Category,
        verbose_name="Категория",
        related_name="product",
        blank=True,
        on_delete=models.CASCADE
    )

    class Meta:
        verbose_name = "Продукт"
        verbose_name_plural = "Список продуктов"

    def __str__(self):
        return f"{self.name}"


class ProductInfo(models.Model):
    """Модель информации о продукте"""

    product = models.ForeignKey(
        Product,
        verbose_name="Продукт",
        related_name="product_info",
        on_delete=models.CASCADE
    ),
    shop = models.ForeignKey(
        Shop,
        verbose_name="Магазин",
        related_name="product_info",
        on_delete=models.CASCADE,
        blank=True
    ),
    quantity = models.IntegerField("Количество в наличии")
    price = models.IntegerField("Цена")
    price_rrc = models.IntegerField("Рекомендованная цена")

    class Meta:
        verbose_name = "Информация о продукте"
        verbose_name_plural = "Список информаций о продуктах"

    def __str__(self):
        return f"{self.product}"


class Parameter(models.Model):
    """Модель параметров"""

    name = models.CharField(max_length=150)

    class Meta:
        verbose_name = "Параметры"
        verbose_name_plural = "Список параметров"

    def __str__(self):
        return f"{self.name}"


class ProductParameter(models.Model):
    """Модель параметров продукта"""

    product_info = models.ForeignKey(
        ProductInfo,
        verbose_name="Информация о продукте",
        related_name="product_parameter",
        on_delete=models.CASCADE
    ),
    parameter = models.ForeignKey(
        Parameter,
        verbose_name="Название параметра",
        related_name="product_parameter",
        on_delete=models.CASCADE,
        blank=True
    ),
    value = models.CharField("Значение", max_length=100)

    class Meta:
        verbose_name = "Параметр продукта"
        verbose_name_plural = "Список параметров продукта"


class Contacts(models.Model):
    """Модель контактов пользователя"""

    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        verbose_name="Пользователь",
        related_name="contacts",
        on_delete=models.CASCADE
    ),
    city = models.CharField("Город", max_length=60),
    district = models.CharField("Район", max_length=60),
    street = models.CharField("Улица", max_length=60),
    house = models.CharField("Дом", max_length=60),
    building = models.CharField("Квартира", max_length=60),
    phone = models.CharField("Номер телефона", max_length=20)

    class Meta:
        verbose_name = "Контакты пользователя"
        verbose_name_plural = "Список контактов пользователей"

    def __str__(self):
        return f'{self.user} - {self.city}'


class Order(models.Model):
    """Модель заказов"""

    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        verbose_name="Пользователь",
        related_name="order",
        on_delete=models.CASCADE
    ),
    created_date = models.DateField("Дата создания", auto_now_add=True),
    state = models.CharField("Статус заказа", choices=STATE_CHOICES, max_length=20),
    contacts = models.ForeignKey(
        Contacts,
        verbose_name="Контакты",
        related_name="order",
        on_delete=models.CASCADE
    )

    class Meta:
        verbose_name = "Заказы"
        verbose_name_plural = "Список заказов"

    def __str__(self):
        return f"{self.created_date}"

    # @property
    # def sum(self):
    #     return self.positions.aggregate(total=Sum("quantity"))["total"]


class OrderItem(models.Model):
    """Модель позиции заказа"""

    order = models.ForeignKey(
        Order,
        verbose_name="Заказ",
        related_name="positions",
        on_delete=models.CASCADE
    )
    product_info = models.ForeignKey(
        ProductInfo,
        verbose_name="Информация о продукте",
        related_name="order_item",
        on_delete=models.CASCADE
    ),
    quantity = models.IntegerField("Количество товара")

    class Meta:
        verbose_name = "Позиция заказа"
        verbose_name_plural = "Список позиций заказов"

    def __str__(self):
        return f"{self.quantity}"

когда набрал команду makemigrations в файле миграции тоже django их не создал. Он как будто не видит эти поля вот мой файл внутри папки migrations 0001_initial.py

# Generated by Django 3.1.2 on 2021-07-07 12:43

from django.conf import settings
import django.contrib.auth.models
import django.contrib.auth.validators
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone


class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('auth', '0012_alter_user_first_name_max_length'),
    ]

    operations = [
        migrations.CreateModel(
            name='User',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('password', models.CharField(max_length=128, verbose_name='password')),
                ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
                ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
                ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
                ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')),
                ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
                ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
                ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
                ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
                ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
                ('user_type', models.CharField(choices=[('Seller', 'Магазин'), ('Buyer', 'Покупатель')], max_length=20, verbose_name='Тип пользователя')),
                ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
                ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
            ],
            options={
                'verbose_name': 'Пользователь',
                'verbose_name_plural': 'Список пользователей',
            },
            managers=[
                ('objects', django.contrib.auth.models.UserManager()),
            ],
        ),
        migrations.CreateModel(
            name='Category',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=50, verbose_name='Название')),
            ],
            options={
                'verbose_name': 'Категория',
                'verbose_name_plural': 'Категории',
            },
        ),
        migrations.CreateModel(
            name='Contacts',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('phone', models.CharField(max_length=20, verbose_name='Номер телефона')),
            ],
            options={
                'verbose_name': 'Контакты пользователя',
                'verbose_name_plural': 'Список контактов пользователей',
            },
        ),
        migrations.CreateModel(
            name='Order',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('contacts', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='order', to='shop.contacts', verbose_name='Контакты')),
            ],
            options={
                'verbose_name': 'Заказы',
                'verbose_name_plural': 'Список заказов',
            },
        ),
        migrations.CreateModel(
            name='Parameter',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=150)),
            ],
            options={
                'verbose_name': 'Параметры',
                'verbose_name_plural': 'Список параметров',
            },
        ),
        migrations.CreateModel(
            name='ProductInfo',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('quantity', models.IntegerField(verbose_name='Количество в наличии')),
                ('price', models.IntegerField(verbose_name='Цена')),
                ('price_rrc', models.IntegerField(verbose_name='Рекомендованная цена')),
            ],
            options={
                'verbose_name': 'Информация о продукте',
                'verbose_name_plural': 'Список информаций о продуктах',
            },
        ),
        migrations.CreateModel(
            name='ProductParameter',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('value', models.CharField(max_length=100, verbose_name='Значение')),
            ],
            options={
                'verbose_name': 'Параметр продукта',
                'verbose_name_plural': 'Список параметров продукта',
            },
        ),
        migrations.CreateModel(
            name='Shop',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=80, verbose_name='Название')),
                ('url', models.URLField(blank=True, null=True, verbose_name='Ссылка')),
                ('state', models.BooleanField(default=True, verbose_name='Статус приёма заказов')),
                ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='Пользователь')),
            ],
            options={
                'verbose_name': 'Магазин',
                'verbose_name_plural': 'Список магазинов',
            },
        ),
        migrations.CreateModel(
            name='Product',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('name', models.CharField(max_length=80, verbose_name='Название')),
                ('category', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, related_name='product', to='shop.category', verbose_name='Категория')),
            ],
            options={
                'verbose_name': 'Продукт',
                'verbose_name_plural': 'Список продуктов',
            },
        ),
        migrations.CreateModel(
            name='OrderItem',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('quantity', models.IntegerField(verbose_name='Количество товара')),
                ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='positions', to='shop.order', verbose_name='Заказ')),
            ],
            options={
                'verbose_name': 'Позиция заказа',
                'verbose_name_plural': 'Список позиций заказов',
            },
        ),
        migrations.AddField(
            model_name='category',
            name='shops',
            field=models.ManyToManyField(blank=True, related_name='categories', to='shop.Shop', verbose_name='Магазин'),
        ),
    ]

как видите и сюда не добавились поля с foreign key! Пробовал всё, удалил проект и БД и создал новый, сменил БД и тп но ничего не сработало!


Ответы (1 шт):

Автор решения: JUST_PROGRAMMER

Решение: По невнимательности я случайно поставил запятые после объявление некоторых полей! Пример( parameter = models.ForeignKey( Parameter, verbose_name="Название параметра", related_name="product_parameter", on_delete=models.CASCADE, blank=True ), как видите после объявление поле тут есть запятая(после закрывающей скобки) поэтому Django их игнорировал

→ Ссылка