ForeignKey到在当前模型之后/之下定义的模型

时间:2016-02-17 14:24:01

标签: django

有错误消息

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

2 个答案:

答案 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指向OrderItemsOrderItems指向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,从OrderOrderedItem有一个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而不是两个外键