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.
精彩评论