开发者

Exception : Does Not Exist

I am trying to fill in the DB table " Notification " through a function as follows :

My models :

 class NotificationType(models.Model):
        type = model开发者_运维问答s.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 )

and am using the function send_as_notification_to() in other app view as :

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})

function definition :

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

Traceback :

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: 


In your send_as_notification_to function you need to assign a NotificationContent instance to the content_id value of your Notification instance:

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

The same will have to be done for NotificationType on Notification.

One piece of advice I'd like to give you:

The fields that you've named with _id on the end (e.g. content_id, notification_type_id) are not storing the id's, they are pointers to the actual objects!!! This means that not only will that model have those fields, but django should (I think) also create the following two fields, which actually do point to the id's of the objects in question: content_id_id, notification_type_id_id.

Very bad, you should just name it after the Model itself, so: content, notification_type.


Based on the traceback it looks like thing are breaking in the send_as_notification_to function on the line that reads:

notification.content_id.link_id = link_id

Based on your code samples I can assume you're using a modelform though I can't tell what model is being instantiated. Check that you actually have a NotificationContent row in the database with the link_id you're passing in.


In the definition of your Notification model you want to reference the NotificationContent model. You've done this by citing content_id as a foreign key.

However the attribute content_id is better named simply content because calling for the attribute will return an instance of the model, not just the identifier.

notification.content_id.link_id = link_id 

returns an error because you're messing with the system identifiers directly instead of letting django's ORM handle it. eg: pass in the object, not the id...

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

You might find ContentTypes and signals directly applicable to your problem.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜