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