После запуска «makemigrations» и «migrate» таблицы не создаются в PostgreSQL

#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 , а затем удалили свои миграции (как правило, удаление миграций может пойти не так, если вы не знаете, что именно вы делаете, или на самом деле собираетесь удалить базу данных), и сейчас вы находитесь в такой ситуации, да? Я бы посоветовал просто удалить базу данных, если там нет ничего важного. В противном случае вам останется выяснить правильное состояние базы данных и отделить / отредактировать файлы миграции вручную в качестве исправления.