Django 在当前模型之后/之下定义的模型的外键

Django 在当前模型之后/之下定义的模型的外键,django,Django,有错误消息 order = models.ForeignKey(Order, on_delete=models.CASCADE) NameError: name 'Order' is not defined 所以无论我怎么做,都会有一节课不见了,因为这节课在当前阅读课的下面,所以这节课不见了。我如何解决这个问题?我读过关于多对多函数的书,这能解决问题吗 class Items(models.Model): name = models.CharField(max_length=10)

有错误消息

order = models.ForeignKey(Order, on_delete=models.CASCADE)
NameError: name 'Order' is not defined
所以无论我怎么做,都会有一节课不见了,因为这节课在当前阅读课的下面,所以这节课不见了。我如何解决这个问题?我读过关于多对多函数的书,这能解决问题吗

class Items(models.Model):
    name = models.CharField(max_length=10)
    def __str__(self):
        return self.name    

class OrderedItem(models.Model):
    items = models.ForeignKey(Items, on_delete=models.CASCADE)
    order = models.ForeignKey(Order, on_delete=models.CASCADE)
    amount = models.IntegerField()
    def __str__(self):
        return self.items

class Order(models.Model):
    #clientID
    orderedItem = models.ForeignKey(OrderedItem, on_delete=models.CASCADE)
    #truckId Foreign key till truck
    created = models.DateTimeField(auto_now=False, auto_now_add=True)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    emergency = models.BooleanField(default=False)
    status = models.IntegerField()
    #building
    #floor
    def __str__(self):
        return self.id

它找不到类顺序的原因是因为它尚未定义,您需要将其指定为Shang Wang所示的字符串,或者在models.py中更改它们的顺序

class Order(models.Model):
    #clientID
    orderedItem = models.ForeignKey(OrderedItem, on_delete=models.CASCADE)
    #truckId Foreign key till truck
    created = models.DateTimeField(auto_now=False, auto_now_add=True)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    emergency = models.BooleanField(default=False)
    status = models.IntegerField()
    #building
    #floor
    def __str__(self):
        return self.id    

class OrderedItem(models.Model):
    items = models.ForeignKey(Items, on_delete=models.CASCADE)
    order = models.ForeignKey(Order, on_delete=models.CASCADE)
    amount = models.IntegerField()
    def __str__(self):
        return self.items
与指定为字符串相比,更改顺序有其优势,因为它允许IDE在需要重构时找到类的用法


由于这两个类都有外键,因此上述方法不起作用,仅适用于一对一或一对多关系。相反,最好定义一个而不是两个外键,使用完全限定的模型字符串 当这种情况发生时,我通常求助于所谓的完全限定模型字符串,这是一个非常重要的术语,以
'app\u label.ModelName'

例如,如果您的模型是
订单
,则模型字符串名称将是字符串
“订单”

因此,您已经可以执行以下操作:

order = models.ForeignKey('Order', on_delete=models.CASCADE)
有了以上内容,Django将在同一个应用程序中查找型号
'Order'
。如果您还没有定义它,只要它已定义,就可以了

如果该模型恰好来自不同的应用程序,它将是:

order = models.ForeignKey('appname.Order', on_delete=models.CASCADE)
反向查询冲突 因为
Order
指向
OrderItems
OrderItems
指向
Order
您会遇到以下冲突:

更好的建模 由于一个
OrderedItem
已经“属于”一个
Order
,所以在
Order
OrderedItem
之间有一个外键是没有意义的,您只需删除它,而不必处理上述冲突

那么你会是这个样子

Item

Order

OrderedItem
    + FK(Item)
    + FK(Order)

一个不涉及引用尚未定义的模型的设计:)

您是否尝试过
order=models.ForeignKey('order',on_delete=models.CASCADE)
?@ShangWang是的,但问题是订单还不存在。在查找Order类时,我没有被创建。请注意,我在
订单
周围添加了引号。我无意为您更改任何内容,但我不禁想知道为什么您在
订单
中将
orderItem
作为外键?用例是什么?但这并不能实现这一点。您应该删除该FK。我不想打扰您,但这是否会造成问题,因为在定义它之前,我们正在使用
OrderedItem
(作为模型引用而不是字符串)?(看起来这将导致与以前相同的问题否?好吧,当我更改为引号时,我得到一个错误消息“Order.orderedItems”的反向查询名称与字段名“OrderedItem.Order”冲突,添加了一个部分来解释第二个FK是基于对关系的根本误解;我认为OP不需要更改相关的名称,或转换为M2M,他们需要删除它。同意,添加了一个建议的DB模型,从一开始就避免了这个难题。
Item

Order

OrderedItem
    + FK(Item)
    + FK(Order)