Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有to_字段属性的Django外键字段存在问题_Python_Django_Database - Fatal编程技术网

Python 具有to_字段属性的Django外键字段存在问题

Python 具有to_字段属性的Django外键字段存在问题,python,django,database,Python,Django,Database,我有一个与组对象相关的用户对象模型(示例)。因此,用户有如下情况: group_name = models.ForeignKey(Group, to_field="group_name", ...) (当然,组\u名称被定义为唯一的,因为它不是组对象中的主键) 但是,当我试图更改某个组对象的group\u name值时(无论是通过管理界面还是通过更新所选对象在代码中),它会引发完整性错误:外键约束失败 我知道外键字段的删除上有一个强制参数,但我尝试了所有可能的预定义值(models.SET\u

我有一个与组对象相关的用户对象模型(示例)。因此,用户有如下情况:

group_name = models.ForeignKey(Group, to_field="group_name", ...)
(当然,
组\u名称
被定义为唯一的,因为它不是组对象中的主键)

但是,当我试图更改某个组对象的
group\u name
值时(无论是通过管理界面还是通过更新所选对象在代码中),它会引发
完整性错误:外键约束失败

我知道外键字段的删除上有一个强制参数
,但我尝试了所有可能的预定义值(
models.SET\u DEFAULT
models.CASCADE
,等等),但没有任何更改

在我看来,我需要在更新时做些什么,但这是不可能的

下面是一些代码示例

class Group(models.Model):  
    members = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='teams', blank=True)
    managers = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='managed_teams')
    # name is short because MySQL does not allow unique char fields to be long
    group_name = models.CharField(max_length=128, unique=True, validators=[RegexValidator(r'^[a-zA-Z0-9 ]+$')])


class User(models.Model):
    name = models.CharField(max_length=200, default="username", blank=False)
    group = models.ForeignKey(Group, null=True, blank=True, on_delete=models.SET_DEFAULT, to_field="name", default="Platform Validation and Testing")
我只是在代码中做了些什么(前提是我已经在数据库中存储了一些具有用户-组关系的对象):

下面是
django.db.utils.IntegrityError:外键约束失败


正如我所提到的,如果我在Django的管理界面中更改组名字段,也会发生同样的情况。

当您更改组名时,指向原始组名的用户突然指向一个不存在的组。因此,如果不先检查是否有用户指向它,就不能这样做。将代码更改为首先检查指向您的组的所有用户,取消设置fk,然后将其重置为新组名或不设置。

您可以显示如何从代码更新值吗。这是非常少的代码来理解实际问题所在,并且需要完整的模型定义来查看数据库中发生了什么。为什么需要在这里使用
to_字段
?有什么原因不能让它直接指向PK吗?当然我可以用原生的PK方法,但如果这种方法也可以的话(根据Django官方文档),我不会重写我的应用程序。你的群组模型中的group_name字段在哪里@AKX@AKX-抱歉-我创建了半实物示例;-)代码现在更新了。非常感谢-我认为这是问题所在,但我认为Django有一些机制可以自动完成这项工作(我一直在思考更新方式上的
)-无论如何,我可能会重新设计我的应用程序以使用组PK,这样名称更改不会影响我。
from myapp.models import Group
group = Group.objects.all()[0]
group.name = "Some new cool name"
group.save()