#python #django #postgresql
Вопрос:
Я пытаюсь добавить дополнительные таблицы в свою базу данных для нового приложения, которое я интегрировал в свой проект Django.
Когда я запускаю python3 manage.py makemigrations
и python3 manage.py migrate
, я вижу, что модели были созданы, однако соответствующие таблицы не добавляются в мою базу данных. Таблицы для сообщений, Предпочтений и комментариев добавляются, но таблицы для навыков, тегов подстановки, Tagulous_SwapTags_title и Tagulous_SwapTags_hobbies не добавляются. (Я не вижу никаких ошибок, объясняющих, почему они не добавляются)
Вот мой файл миграции:
# Generated by Django 3.2.2 on 2021-05-26 15:22
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import tagulous.models.fields
import tagulous.models.models
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Post',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('content', models.TextField(max_length=1000)),
('date_posted', models.DateTimeField(default=django.utils.timezone.now)),
('image', models.ImageField(default='default.png', upload_to='srv_media')),
('likes', models.IntegerField(default=0)),
('dislikes', models.IntegerField(default=0)),
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
migrations.CreateModel(
name='Skill',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, unique=True)),
('slug', models.SlugField()),
('count', models.IntegerField(default=0, help_text='Internal counter of how many times this tag is in use')),
('protected', models.BooleanField(default=False, help_text='Will not be deleted when the count reaches 0')),
('path', models.TextField()),
('label', models.CharField(help_text='The name of the tag, without ancestors', max_length=255)),
('level', models.IntegerField(default=1, help_text='The level of the tag in the tree')),
('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='sfsrv.skill')),
],
options={
'ordering': ('name',),
'abstract': False,
'unique_together': {('slug', 'parent')},
},
bases=(tagulous.models.models.BaseTagTreeModel, models.Model),
),
migrations.CreateModel(
name='Tagulous_SwapTags_title',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, unique=True)),
('slug', models.SlugField()),
('count', models.IntegerField(default=0, help_text='Internal counter of how many times this tag is in use')),
('protected', models.BooleanField(default=False, help_text='Will not be deleted when the count reaches 0')),
],
options={
'ordering': ('name',),
'abstract': False,
'unique_together': {('slug',)},
},
bases=(tagulous.models.models.BaseTagModel, models.Model),
),
migrations.CreateModel(
name='Tagulous_SwapTags_hobbies',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, unique=True)),
('slug', models.SlugField()),
('count', models.IntegerField(default=0, help_text='Internal counter of how many times this tag is in use')),
('protected', models.BooleanField(default=False, help_text='Will not be deleted when the count reaches 0')),
],
options={
'ordering': ('name',),
'abstract': False,
'unique_together': {('slug',)},
},
bases=(tagulous.models.models.BaseTagModel, models.Model),
),
migrations.CreateModel(
name='SwapTags',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
('hobbies', tagulous.models.fields.TagField(_set_tag_meta=True, blank=True, force_lowercase=True, help_text='This field splits on spaces and commas', initial='eating, coding, gaming', to='sfsrv.Tagulous_SwapTags_hobbies')),
('skills', tagulous.models.fields.TagField(_set_tag_meta=True, autocomplete_view='swaptags_skills_autocomplete', help_text='This field does not split on spaces', initial='"Accountancy/Tax Returns", "Decorator/Residential Decorator", "Gardener/Home Garden Maintenance", "Gardener/Public Spaces", "Plumber/Home Plumber", Accountancy/Bookkeeping', space_delimiter=False, to='sfsrv.Skill', tree=True)),
('title', tagulous.models.fields.SingleTagField(_set_tag_meta=True, blank=True, help_text='This is a SingleTagField - effectively a CharField with dynamic choices', initial='Accountant, Decorator', null=True, on_delete=django.db.models.deletion.CASCADE, to='sfsrv.tagulous_swaptags_title')),
],
options={
'verbose_name_plural': 'swaptags',
},
),
migrations.CreateModel(
name='Comment',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('content', models.TextField(max_length=150)),
('date_posted', models.DateTimeField(default=django.utils.timezone.now)),
('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
('post_connected', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sfsrv.post')),
],
),
migrations.CreateModel(
name='Preference',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('value', models.IntegerField()),
('date', models.DateTimeField(auto_now=True)),
('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sfsrv.post')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
options={
'unique_together': {('user', 'post', 'value')},
},
),
]
Admin.py
from django.contrib import admin
from django.db import models
import tagulous.admin
from sfsrv.models import Post, Comment, Preference, SwapTags, Skill
admin.site.register(Post)
admin.site.register(Comment)
admin.site.register(Preference)
# Register the SwapTags with a custom ModelAdmin
class SwapTagsAdmin(admin.ModelAdmin):
list_display = ("name", "title", "skills", "hobbies")
list_filter = ("name", "title", "skills", "hobbies")
tagulous.admin.register(SwapTags, SwapTagsAdmin)
# Auto-gen the ModelAdmins for skills and hobbies
tagulous.admin.register(Skill)
tagulous.admin.register(SwapTags.hobbies.tag_model)
# Give the Title ModelAdmin the people as inlines
class SwapTagsInline(admin.TabularInline):
model = SwapTags
extra = 3
class TitleAdmin(admin.ModelAdmin):
inlines = [SwapTagsInline]
tagulous.admin.register(SwapTags.title.tag_model, TitleAdmin)
Models.py
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse
from PIL import Image
import tagulous.models
class Post(models.Model):
content = models.TextField(max_length=1000)
date_posted = models.DateTimeField(default=timezone.now)
image = models.ImageField(default='default.png', upload_to='srv_media')
author = models.ForeignKey(User, on_delete=models.CASCADE)
likes= models.IntegerField(default=0)
dislikes= models.IntegerField(default=0)
def __str__(self):
return self.content[:5]
img = Image.open(self.image.path)
if img.height > 300 or img.width > 300:
output_size = (300, 300)
img.thumbnail(output_size)
img.save(self.image.path)
@property
def number_of_comments(self):
return Comment.objects.filter(post_connected=self).count()
class Comment(models.Model):
content = models.TextField(max_length=150)
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
post_connected = models.ForeignKey(Post, on_delete=models.CASCADE)
class Preference(models.Model):
user= models.ForeignKey(User, on_delete=models.CASCADE)
post= models.ForeignKey(Post, on_delete=models.CASCADE)
value= models.IntegerField()
date= models.DateTimeField(auto_now= True)
def __str__(self):
return str(self.user) ':' str(self.post) ':' str(self.value)
class Meta:
unique_together = ("user", "post", "value")
class Skill(tagulous.models.TagTreeModel):
class TagMeta:
initial = [
"Accountancy/Bookkeeping",
"Accountancy/Tax Returns",
"Decorator/Residential Decorator",
"Plumber/Home Plumber",
"Gardener/Home Garden Maintenance",
"Gardener/Public Spaces",
]
space_delimiter = False
autocomplete_view = "swaptags_skills_autocomplete"
class SwapTags(models.Model):
name = models.CharField(max_length=255)
title = tagulous.models.SingleTagField(
initial="Accountant, Decorator",
help_text=(
"This is a SingleTagField - effectively a CharField with " "dynamic choices"
),
on_delete=models.CASCADE,
)
skills = tagulous.models.TagField(
Skill, help_text="This field does not split on spaces"
)
hobbies = tagulous.models.TagField(
initial="eating, coding, gaming",
force_lowercase=True,
blank=True,
help_text="This field splits on spaces and commas",
)
class Meta:
verbose_name_plural = "swaptags"
Любые предложения будут приветствоваться! Спасибо вам 🙂
Комментарии:
1. Удалите все предыдущие миграции и повторите попытку с помощью этих команд..
2. Спасибо вам за ваш комментарий. Должен ли я очистить историю миграции с помощью
python manage.py migrate --fake myapp zero
? а затем попробуйте повторить миграцию (после удаления соответствующих файлов миграции?)3. Да, вы пробовали?
4. @Jarjar95
python manage.py migrate --fake myapp zero
не идеально подходит для вашей ситуации, это только усложнит ее для вас. » соответствующие таблицы не добавляются в мою базу данных» как вы это проверили? Случайно, вы не определяетеDATABASE_ROUTERS
в своих настройках?5. @Jarjar95 Я предполагаю, что вы использовали
--fake
флаг при неправильном выполнении миграции. Я предполагаю, что вы получили ошибку, а затем использовали--fake
, а затем удалили свои миграции (как правило, удаление миграций может пойти не так, если вы не знаете, что именно вы делаете, или на самом деле собираетесь удалить базу данных), и сейчас вы находитесь в такой ситуации, да? Я бы посоветовал просто удалить базу данных, если там нет ничего важного. В противном случае вам останется выяснить правильное состояние базы данных и отделить / отредактировать файлы миграции вручную в качестве исправления.