2016-03-09 65 views
0

顯然它是一個循環導入,但是我需要知道如何分解它並仍然保留我的功能。無法從App1.models導入模型,而App.2正在導入App1的模型

我的應用程序Profile有一個叫Notification模型,這個模型Notification具有與我的Track模型,它是我在其他應用程序Submission一個ForeignKeySubmission也有一個名爲Comment的模型,這有一個保存方法,它也應該創建一個Notification

內Profile.models.py:

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) 

這將導入 「軌道」,你可以看到,現在裏面Submission.models.py:

from django.db import models 
from django.core.exceptions import ValidationError 
from django.core.files.images import get_image_dimensions 
from django.contrib.auth.models import User 
from Submission.storage import OverwriteStorage 
from Profile.models import Notification 

class Track(models.Model): 

    ... 

class Comment(models.Model): 
    user = models.ForeignKey(User, unique=False) 
    track = models.ForeignKey(Track, unique=False, related_name = 'comments') 
    content = models.TextField(max_length=450) 
    created = models.DateTimeField(auto_now=False,auto_now_add=True) 
    edited = models.BooleanField(default=False) 
    replies = models.ManyToManyField('Comment', blank=True) 
    score = models.BigIntegerField(default=0) 

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

    def save(self, *args, **kwargs): 
     super(Comment, self).save(*args, **kwargs) 
     notification = Notification(user=self.track.user, sender=self.user, track=self.track, content_type='comment', content=self.content) 

所以在這裏你可以看到我創建評論時創建通知。不過,我不能這樣做,因爲我必須從已從導入中導入跟蹤的配置文件導入通知。我可以在我的視圖中創建通知,但我覺得這不是Django的方式。

+1

您尚未解釋爲什麼需要將跟蹤導入通知。 –

+0

@DanielRoseman呃,對不起。通知需要跟蹤關聯。因此,用戶可以在用戶界面中單擊該通知,並將它們帶到被評論的軌道。編輯:我已經添加了缺少的代碼。 –

回答

2

有沒有必要將跟蹤導入通知。 Django允許你以一個字符串的形式引用ForeignKey定義中的模型,格式爲「appname.ModelName」。所以:

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

請注意您的相關名稱在這裏沒有意義;他們是從反向關係的名稱(例如)追溯到通知,這是一個集合,因此稱之爲「追蹤」是沒有意義的。刪除它,以便Django使用默認的notification_set

另請注意,您並不需要將通知導入提交;您可以使用這些相同的反向關係創建通知,而無需直接引用模型:

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

你是一個救生員,我不知道我可以在FK中使用一個字符串。謝謝! –