当App.2导入App1的模型时,无法从App1.models导入模型

时间:2016-03-09 22:12:56

标签: django

显然这是一个循环导入,但我需要知道如何打破它并仍然保持我的功能。

我的应用Profile有一个名为Notification的模型,此Notification模型的ForeignKeyTrack模型相关,该模型位于我的其他应用中{ {1}}。 Submission还有一个名为Submission的模型,它有一个保存方法,它也应该创建一个Comment

Inside Profile.models.py:

Notification

现在可以在Submission.models.py:

中导入“Track”
from django.db import models
from django.contrib.auth.models import User
from Submission.storage import OverwriteStorage
from Submission.models import Track
from django.core.cache import cache 
from project import settings
from datetime import datetime   

Profile.models.py:
    ...

class Notification(models.Model):
    user = models.ForeignKey(User, related_name='reciever')
    sender = models.ForeignKey(User, related_name='sender')
    track = models.ForeignKey(Track, related_name='track')
    content_type = models.CharField(max_length=30)
    content = models.CharField(max_length=200)
    created = models.DateTimeField(auto_now=False,auto_now_add=True)

    class Meta:
        ordering = ('-created',)

    def save(self, *args, **kwargs):
        super(Notification, self).save(*args, **kwargs)  # Call the "real" save() method
        UserProfile.objects.filter(id=self.user.userprofile.id).update(unread_notifications=True)

所以在这里你可以看到我在创建评论时创建通知。但是我不能这样做,因为我必须从Profile中导入Notification,它已经从Submission导入Track。我可以在我的视图中创建通知,但我觉得这不是django方式。

1 个答案:

答案 0 :(得分:2)

无需将Track导入Notification。 Django允许您将ForeignKey定义中的模型称为字符串,格式为" appname.ModelName"。所以:

track = models.ForeignKey("Submission.Track")

注意你的相关名字在这里没有意义;它们是反向关系的名称(例如)追溯到通知,这是一个集合,因此称之为" Track"是没有意义的。删除它,以便Django使用默认的notification_set

另请注意,您并非真的需要将通知导入提交内容;您可以使用相同的反向关系创建通知,而无需直接引用模型:

notification = self.track.notification_set.create(user=self.track.user, sender=self.user, content_type='comment', content=self.content)