2011-05-10 23 views
0

我想通过一个函数来填写数据库表“通知”如下:例外:不存在

我的模型:

class NotificationType(models.Model): 
     type = models.CharField(max_length = 100) 
     application = models.CharField(max_length = 100) 
     description = models.CharField(max_length = 1000 , null = True) 

class NotificationContent(models.Model): 
     link_id = models.IntegerField() 
     unique_content = models.CharField(max_length = 500) 

class Notification(models.Model): 
     person = models.ForeignKey(User) 
     content_id = models.ForeignKey(NotificationContent) 
     notification_type_id = models.ForeignKey(NotificationType) 
     datetime = models.DateTimeField(auto_now_add = True) 
     is_active = models.BooleanField(default = 1) 
     read_unread = models.BooleanField(default = 0) 

和我在其他使用功能send_as_notification_to()应用视图为:

def crave_form(request): 
    if request.method == 'POST': 
     form = IcraveForm(request.POST) 
     if form.is_valid(): 
      crave = form.save(commit = False) 
      crave.person = request.user 
      crave.save() 
      send_as_notification_to(crave.person , crave.id , crave.person , 'icrave' , 'crave') 
    else: 
     form = IcraveForm() 
    return render(request, 'icrave/form.html', { 'form' : form}) 

函数定义:

def send_as_notification_to(person , link_id , unique_content , which_app, notification_type): 

     notification = Notification(person = person) 
     notification.content_id.link_id = link_id 
     notification.content_id.unique_content = unique_content 
     notification.notification_type_id.type = notification_type 
     notification.notification_type_id.application = which_app 

回溯:

Environment: 


Request Method: POST 
Request URL: http://localhost:8000/icrave/create/ 

Django Version: 1.3 
Python Version: 2.7.1 
Installed Applications: 
['django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.comments', 
'ec.kiosk', 
'ec.chakra', 
'ec.ajax', 
'ec.broadcast', 
'ec.connect', 
'ec.seek', 
'ec.feed', 
'ec.ec_model', 
'ec.info', 
'ec.domains', 
'ec.souk', 
'ec.meta', 
'ec.shastra', 
'ec.chat', 
'ec.log', 
'ec.icrave', 
'ec.notification', 
'django.contrib.admin'] 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware') 


Traceback: 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    111.       response = callback(request, *callback_args, **callback_kwargs) 
File "/Volumes/Disk2/workspace/ec/ec/icrave/views.py" in crave_form 
    16.    send_as_notification_to(crave.person , crave.id , crave.person , 'icrave' , 'crave') 
File "/Volumes/Disk2/workspace/ec/ec/notification/api.py" in send_as_notification_to 
    6.   notification.content_id.link_id = link_id 
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/models/fields/related.py" in __get__ 
    301.     raise self.field.rel.to.DoesNotExist 

Exception Type: DoesNotExist at /icrave/create/ 
Exception Value: 
+0

有没有人可以帮助我? – 2011-05-10 15:38:09

回答

1

在你send_as_notification_to功能,你需要一个NotificationContent实例分配给您的通知实例的content_id值:

nc = NotificationContent.objects.create(link_id=link_id, unique_content= unique_content) 
notification = Notification(person = person) 
notification.content_id = nc 
... 

通知上的NotificationType也必须完成。

一个建议的一块,我想给你:

您与_id上月底命名(如的content_id,notification_type_id)不存储的ID字段,它们指向实际对象!这意味着该模型不仅具有这些字段,而且django应该(我认为)还创建以下两个字段,其实际上指向有问题的对象的id:content_id_id,notification_type_id_id。

非常糟糕,您应该在模型本身后面将其命名为:content,notification_type。

0

基于它看起来像东西就行了send_as_notification_to功能读取被打破了回溯:基于您的代码样本

notification.content_id.link_id = link_id 

我可以假设你尽管我不能说出正在实例化的模型,但是使用了模型。检查你确实有一个NotificationContent行中与你传递的link_id数据库

0

在您的Notification模型的定义中,您想引用NotificationContent模型。您通过引用content_id作为外键完成了此操作。

但是,属性content_id最好只命名为content,因为调用该属性将返回模型的一个实例,而不仅仅是标识符。

notification.content_id.link_id = link_id 

因为你与系统标识符搞乱,而不是直接让Django的ORM处理它返回一个错误。例如:通过在对象,而不是ID ...

def send_as_notification_to(obj...): 
    notification.content = obj 

您可能会发现ContentTypessignals直接适用于您的问题。