调用尚未定义的模型';预定义模型方法Django中的s管理器

调用尚未定义的模型';预定义模型方法Django中的s管理器,django,django-models,Django,Django Models,我有两种型号: class Person(models.Model): name = models.CharField(max_length=150) def __str__(self): return self.name class Message(models.Model): sender = models.ForeignKey(Person, related_name='messages_sent', on_delete=models.CASC

我有两种型号:

class Person(models.Model):
    name = models.CharField(max_length=150)

    def __str__(self):
        return self.name


class Message(models.Model):
    sender = models.ForeignKey(Person, related_name='messages_sent', on_delete=models.CASCADE)
    recipient = models.ForeignKey(Person, related_name='messages_recieved', on_delete=models.CASCADE)
    text = models.TextField()

    def __str__(self):
        return self.text
请注意,
Person
是在
消息之前定义的

如果我像这样使用
外键,我可以在
Person
中的定义之前引用
消息

class Person(models.Model):
    myfield = models.ForeignKey('message', on_delete=models.CASCADE)
在定义之前调用尚未定义的模型

但是,在以前定义的模型的方法中调用尚未定义的模型的最佳方法是什么

示例:

class Person(models.Model):
    name = models.CharField(max_length=150)
    myfield = models.ForeignKey('message', on_delete=models.CASCADE)  # First reference before definition

    def __str__(self):
        return self.name

    def send_message(self, message, recipient):
        sent_message = Message.objects.create(sender=self, recipient=recipient, text=message)  # Second reference before definition in a method somehow?
        return sent_message


class Message(models.Model):
    sender = models.ForeignKey(Person, related_name='messages_sent', on_delete=models.CASCADE)
    recipient = models.ForeignKey(Person, related_name='messages_recieved', on_delete=models.CASCADE)
    text = models.TextField()

    def __str__(self):
        return self.text
有没有一种方法可以做到这一点,而不用在消息模型下定义Person模型

如果是这样,最好的方法是什么

提前谢谢

编辑:

class Person(models.Model):
    name = models.CharField(max_length=150)
    myfield = models.ForeignKey('message', on_delete=models.CASCADE)  # First reference before definition

    def __str__(self):
        return self.name

    def send_message(self, message, recipient):
        sent_message = Message.objects.create(sender=self, recipient=recipient, text=message)  # Second reference before definition in a method somehow?
        return sent_message


class Message(models.Model):
    sender = models.ForeignKey(Person, related_name='messages_sent', on_delete=models.CASCADE)
    recipient = models.ForeignKey(Person, related_name='messages_recieved', on_delete=models.CASCADE)
    text = models.TextField()

    def __str__(self):
        return self.text
这实际上可以在以后定义模型时使用

我不确定我之前收到错误的原因。

已经解决了

您可以通过未定义的ForeignKey模型的相关名称来调用该模型

在这种情况下,我可以:

class Person(models.Model): 
    name = models.CharField(max_length=150):

    def __str__(self):
        return self.name

    def send_message(self, recipient, message):
        sent_message = self.messages_sent.create(recipient=recipient, text=message)  # "messages_sent" is the related name of the later defined "Message"'s ForeignKey
        return sent_message

class Message(models.Model):
    sender = models.ForeignKey(Person, related_name='messages_sent', on_delete=models.CASCADE)
    recipient = models.ForeignKey(Person, related_name='messages_recieved', on_delete=models.CASCADE)
    text = models.TextField()

    def __str__(self):
        return self.text

您是否遇到任何错误,特别是
NameError:name'Message'在访问
Message.objects.create(…)
方法中未定义
send_Message()
时?嗯,出于某种原因,我在以前的项目中遇到过,但现在在测试环境中执行时,它似乎工作正常。它给了我一个类似“在定义之前不能使用未定义的模型管理器”之类的错误。Python不会在项目开始时计算该语句,因此肯定不会有任何NameError。此外,
self.messages\u sent
是相关的管理器,而不是默认的管理器。默认情况下,两者都是相同的,但是,两者可以不同。是的,我甚至重置了数据库,实际上我已经在上面工作了。不幸的是,我不确定我以前是如何收到这个错误的。我昨天在另一个项目上收到了它,并找到了一个解决方法,将顶级模型置于未定义模型之下。