【问题标题】:how to alter model field to foreign key with existing tables如何使用现有表将模型字段更改为外键
【发布时间】:2022-01-09 14:50:35
【问题描述】:

我有一个简单的模型。该表在 db 中有一些条目。而且,它们的category 字段不为空:

# blog.models.py

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    category = models.CharField(max_length=50)

我想将category 字段更改为外键。 category 表创建如下,这些字段更改为外键:

# blog.models.py

from django.db import models
from account.models import User

class Category(models.Model):
    title = models.CharField(max_length=50)
    
    def __str__(self):
        return self.title
        

class Article(models.Model):
    title = models.CharField(max_length=100)
    
    # category = models.CharField(max_length=50)
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, 
                             null=True, blank=True, 
                             default=Category.objects.get(title=title))

我有这些限制:

  1. 不应删除博客应用的migration 目录。
  2. category 键应指向具有相同title 的类别对象。如果一个类别对象被删除,指向它的文章的类别字段应该为空。

这是我的问题:

当我执行migrate 时,django 说

提高 self.model.DoesNotExist( blog.models.Category.DoesNotExist: 类别匹配查询不存在。

这是因为我有几篇文章。但是,类别表是空的。因此,Django 没有找到任何类别对象来指向现有文章。

我试图删除category字段的默认值:

category = models.ForeignKey(Category, on_delete=models.SET_NULL, 
                                 null=True, blank=True )

但是,migrate 给出了这个错误:

raise IntegrityError(django.db.utils.IntegrityError: 中的行 主键为“1”的表“blog_article”具有无效的外键: blog_article.category_id 包含一个不 在 blog_category.id 中有对应的值。

将模型字段更改为指向包含某些数据的现有表的外键的正确方法是什么。

【问题讨论】:

    标签: python django django-models foreign-keys


    【解决方案1】:

    根据Django document,我认为在两个模型的元数据中将 managed 选项设置为 False 可以帮助您。

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 2017-08-16
      • 2017-09-17
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 2020-03-21
      • 2017-10-04
      • 2016-04-24
      相关资源
      最近更新 更多