有错误消息
order = models.ForeignKey(Order, on_delete=models.CASCADE)
NameError: name 'Order' is not defined
所以我怎么做一个类将缺少课程的cuz在当前阅读课程之下,以便缺少课程。我该如何解决这个问题?我已经阅读了多对多功能,可能解决了这个问题吗?
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
答案 0 :(得分:13)
当发生这种情况时,我通常会使用所谓的完全限定的模型字符串,这是一个花哨的术语,代表模型和包含应用程序的字符串。 'app_label.ModelName'
E.g。如果您的模型是Order
,那么模型字符串名称将是字符串'Order'
所以你已经可以了:
order = models.ForeignKey('Order', on_delete=models.CASCADE)
有了上述内容,Django将在同一个应用程序中查找模型'Order'
。如果你还没有定义它,只要它被定义就没关系。
如果该模型碰巧来自不同的应用程序,那将是:
order = models.ForeignKey('appname.Order', on_delete=models.CASCADE)
由于Order
指向OrderItems
且OrderItems
指向Order
,因此您与related queries that Django generate for you. You can disable those with related_name='+'
发生冲突:
order = models.ForeignKey('Order', on_delete=models.CASCADE, related_name='+')
由于OrderedItem
已经"属于"对于Order
,从Order
到OrderedItem
有一个ForeignKey是没有意义的,你可以删除它而不是处理上述冲突。
所以你拥有的东西会是这样的
Item
Order
OrderedItem
+ FK(Item)
+ FK(Order)
一种不涉及引用尚未定义的模型的设计:)
答案 1 :(得分:0)
它无法找到课程顺序的原因是因为它尚未定义,您需要将其指定为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在需要重构时查找类的用法。
由于您拥有两个类的外键,因此上述功能不会起作用,仅适用于一对一或一对多关系。相反,最好定义ManyToManyField
而不是两个外键