调用尚未定义的模型';预定义模型方法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
是相关的管理器,而不是默认的管理器。默认情况下,两者都是相同的,但是,两者可以不同。是的,我甚至重置了数据库,实际上我已经在上面工作了。不幸的是,我不确定我以前是如何收到这个错误的。我昨天在另一个项目上收到了它,并找到了一个解决方法,将顶级模型置于未定义模型之下。