Исключение: не существует - PullRequest
0 голосов
/ 10 мая 2011

Я пытаюсь заполнить таблицу БД "Уведомление" с помощью функции следующим образом:

Мои модели:

 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: 

Ответы [ 3 ]

1 голос
/ 10 мая 2011

В вашей функции send_as_notification_to вам необходимо назначить экземпляр NotificationContent для значения content_id вашего экземпляра Notification:

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

То же самое необходимо сделать для NotificationType при уведомлении.

Один совет, который я хотел бы дать вам:

Поля, которые вы назвали с помощью _id в конце (например, content_id, messages_type_id), не хранят идентификаторы, они являются указателями на реальные объекты!!!Это означает, что эта модель не только будет иметь эти поля, но django должен (я думаю) также создать следующие два поля, которые на самом деле do указывают на идентификаторы рассматриваемых объектов: content_id_id, messages_type_id_id.

Очень плохо, вы должны просто назвать его в честь самой Модели, так: content, messages_type.

0 голосов
/ 11 мая 2011

В определении вашей модели Notification вы хотите сослаться на модель NotificationContent.Вы сделали это, указав content_id в качестве внешнего ключа.

Однако атрибут content_id лучше назвать просто content, потому что вызов атрибута вернет экземпляр модели, а не толькоidentifier.

notification.content_id.link_id = link_id 

возвращает ошибку, потому что вы связываетесь с системными идентификаторами напрямую, вместо того, чтобы позволить ORM django обрабатывать его.Например: передать объект, а не идентификатор ...

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

Вы можете найти ContentTypes и сигналы , непосредственно применимые к вашей проблеме.

0 голосов
/ 10 мая 2011

Исходя из трассировки, похоже, что в функции send_as_notification_to в строке, которая гласит:

notification.content_id.link_id = link_id

, происходит сбойне сказать, какая модель создается.Убедитесь, что в базе данных есть строка NotificationContent с передаваемым вами link_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...