显然这是一个循环导入,但我需要知道如何打破它并仍然保持我的功能。
我的应用Profile
有一个名为Notification
的模型,此Notification
模型的ForeignKey
与Track
模型相关,该模型位于我的其他应用中{ {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方式。
答案 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)