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)