Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.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 CheckConstraint不断抛出FieldError_Python_Django_Database_Django Models_Check Constraints - Fatal编程技术网

Python CheckConstraint不断抛出FieldError

Python CheckConstraint不断抛出FieldError,python,django,database,django-models,check-constraints,Python,Django,Database,Django Models,Check Constraints,所以我一直在努力在我的项目中实现以下系统。类似于Twitter跟踪系统的工作原理。我环顾四周,发现了一些想法。现在,my models.py的整体外观如下所示: class Profile(models.Model): user = models.OneToOneField("User", on_delete=models.CASCADE, primary_key=True) friend = models.ManyToManyField("User

所以我一直在努力在我的项目中实现以下系统。类似于Twitter跟踪系统的工作原理。我环顾四周,发现了一些想法。现在,my models.py的整体外观如下所示:

class Profile(models.Model):
    user = models.OneToOneField("User", on_delete=models.CASCADE, primary_key=True)
    friend = models.ManyToManyField("User", related_name='following', blank=True, symmetrical=False)

    class Meta:
        constraints = [
            models.CheckConstraint(check=~Q(user=F('friend')),  name="user_cannot_be_following_themselves"),
        ]
型号.py

from django.contrib.auth.models import AbstractUser
from django.db.models.fields import DateTimeField
from django.utils import timezone
from django.db import models
# pylint: disable=no-member

class User(AbstractUser):
    pass


class Profile(models.Model):
    user = models.OneToOneField("User", on_delete=models.CASCADE, primary_key=True)
    friend = models.ManyToManyField("User", related_name='following', blank=True, symmetrical=False)


    
class Post(models.Model):
    creator = models.ForeignKey("User", on_delete=models.CASCADE, related_name="post_creator")
    content = models.TextField(max_length=250, blank=True)
    created = models.DateTimeField(auto_now_add=True)
    likes = models.PositiveIntegerField(default=0)

    def serialize(self):
        return {
            "id": self.id,
            "creator": self.creator.username,
            "content": self.content,
            "created": self.created.strftime("%d %b %Y, %H:%M"),
            "likes": self.likes
        }
现在的问题是,用户可以按照我不希望的方式进行操作。当然,我尝试使用CheckConstraint,在我的配置文件模型中添加一个类元,如下所示:

class Profile(models.Model):
    user = models.OneToOneField("User", on_delete=models.CASCADE, primary_key=True)
    friend = models.ManyToManyField("User", related_name='following', blank=True, symmetrical=False)

    class Meta:
        constraints = [
            models.CheckConstraint(check=~Q(user=F('friend')),  name="user_cannot_be_following_themselves"),
        ]
这会不断产生此错误
django.core.exceptions.FieldError:无法将关键字“friend”解析到字段中。每次我尝试迁移更改时(在makemigrations之后),选择是:id、user、user\u id
。即使我删除了Meta类并尝试进行迁移,然后再次迁移,我仍然会收到相同的错误。这几乎就好像元类破坏了整个数据库,根本不允许我迁移更改。即使在我删除了所有迁移文件(除了init.py)并尝试进行迁移和从头开始迁移之后,我仍然会遇到这个错误。因此,这意味着我必须继续回到我的项目的早期版本,并从那里重新开始

除了CheckConstraints,我是否可以使用其他方法来确保两个字段的值不相同,或者是否有人理解我遇到的错误,并且可以看到我做错了什么?

使用显式的方法,并在那里添加约束。