代码之家  ›  专栏  ›  技术社区  ›  Raniere Silva

Django flush引发“不能截断外键约束中引用的表”

  •  0
  • Raniere Silva  · 技术社区  · 6 月前

    考虑以下几点 models.py :

    from django.db import models
    
    class Foo(models.Model):
        bars = models.ManyToManyField(
            "Bar",
            blank=True
        )
    
    class Bar(models.Model):
        foos = models.ManyToManyField(
            "Foo",
            blank=True,
            through="Foo_bars"
        )
    

    以及相关的迁移:

    from django.db import migrations, models
    
    
    class Migration(migrations.Migration):
        initial = True
    
        dependencies = []
    
        operations = [
            migrations.CreateModel(
                name="Bar",
                fields=[
                    (
                        "id",
                        models.BigAutoField(
                            auto_created=True,
                            primary_key=True,
                            serialize=False,
                            verbose_name="ID",
                        ),
                    ),
                ],
            ),
            migrations.CreateModel(
                name="Foo",
                fields=[
                    (
                        "id",
                        models.BigAutoField(
                            auto_created=True,
                            primary_key=True,
                            serialize=False,
                            verbose_name="ID",
                        ),
                    ),
                    ("bars", models.ManyToManyField(blank=True, to="demo.bar")),
                ],
            ),
            migrations.AddField(
                model_name="bar",
                name="foos",
                field=models.ManyToManyField(blank=True, to="demo.foo"),
            ),
        ]
    

    跑步

    python manage.py migrate && python manage.py flush --no-input --traceback
    

    生成以下回溯

      File "/opt/venv/lib/python3.13/site-packages/psycopg/cursor.py", line 97, in execute
        raise ex.with_traceback(None)
    django.db.utils.NotSupportedError: cannot truncate a table referenced in a foreign key constraint
    DETAIL:  Table "demo_bar_foos" references "demo_foo".
    HINT:  Truncate table "demo_bar_foos" at the same time, or use TRUNCATE ... CASCADE.
    

    我该如何解决这个问题?如何添加级联?

    完整的可复制示例可在 https://github.com/rgaiacs/django-flush-problem .

    1 回复  |  直到 6 月前
        1
  •  2
  •   willeM_ Van Onsem    6 月前

    这是 如何定义 ManyToManyField s.如果你定义一个 ManyToManyField 在其中一个模型中,您可以从另一个方向访问它,因为 foo_bars ,所以:

    from django.db import models
    
    
    class Foo(models.Model):
        bars = models.ManyToManyField('Bar', blank=True, related_name='foos')
    
    
    class Bar(models.Model):
        # foos = models.ManyToManyField(
        #    "Foo",
        #    blank=True,
        #    through="Foo_bars"
        # )
        pass

    因此,它允许与 my_bar.foos.all() 因为 related_name=... Â [Django-doc] .