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

Lor*_*orr 9 django

有错误消息

order = models.ForeignKey(Order, on_delete=models.CASCADE)
NameError: name 'Order' is not defined
Run Code Online (Sandbox Code Playgroud)

因此,我怎么做一个类将缺少课程的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
Run Code Online (Sandbox Code Playgroud)

bak*_*kal 13

使用完全限定的模型字符串

当发生这种情况时,我通常会使用所谓的完全限定的模型字符串,这是一个花哨的术语,代表模型的字符串和包含应用程序的格式'app_label.ModelName'

例如,如果您的模型是Order,则模型字符串名称将是字符串'Order'

所以你已经可以做到:

order = models.ForeignKey('Order', on_delete=models.CASCADE)
Run Code Online (Sandbox Code Playgroud)

有了上述,Django将'Order'在同一个应用程序中寻找模型.如果您尚未定义它,也可以,只要它已定义.

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

order = models.ForeignKey('appname.Order', on_delete=models.CASCADE)
Run Code Online (Sandbox Code Playgroud)

反向查询冲突

因为Order指向OrderItemsOrderItems指向Order与Django为您生成的相关查询related_name='+'发生冲突.您可以禁用以下内容:

order = models.ForeignKey('Order', on_delete=models.CASCADE, related_name='+')
Run Code Online (Sandbox Code Playgroud)

更好的建模

由于OrderedItem已经"属于"的Order,有一个在其从一个ForeignKey没有点OrderOrderedItem,你可以只是将其删除,而不是处理上述冲突.

所以你拥有的将是这样的

Item

Order

OrderedItem
    + FK(Item)
    + FK(Order)
Run Code Online (Sandbox Code Playgroud)

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