2013-12-23 3 views
0

-> 'views.py':PRIMARY KEY должна быть уникальной ошибки (Джанго)

def upload_event_image(request): 
    if request.method=="POST": 
    if request.FILES: 
     fest=get_object_or_404(Fest, pk=request.POST.get('fest_pk')) 
     if fest is not None: 
     event = Event.objects.create(
      author = request.user, 
      fest = fest, 
     ) 
     event.save() 
     if event: 
      photo= Photo.objects.create(
      image = request.FILES['file'], 
      album = event //This line causes the error 
     ) 
      photo.save() 
     return HttpResponse() 
    return HttpResponse() 

-> model.py:

class Event(models.Model): 
    title = models.CharField(max_length=60, blank=True) 
    description = models.TextField(blank = True) 
    fest = models.ForeignKey(Fest) 
    pub_date = models.DateTimeField(default=datetime.datetime.now) 
    author = models.ForeignKey(User) 

    def __unicode__(self): 
     return self.description 

    def has_upvoted(self, user): 
     return user 

class Photo(models.Model): 
    title = models.CharField(max_length=60 , blank= True, null = True) 
    image = models.ImageField(upload_to='site-media/media/images/') 
    thumbnail = models.ImageField(upload_to="site-media/media/images/thumbs/", blank=True, null=True) 
    thumbnail2 = models.ImageField(upload_to="site-media/media/images/thumbs2/", blank=True, null=True) 
    pub_date = models.DateTimeField(auto_now_add=True) 
    album = models.ForeignKey(Event) 

Когда я сделать запись в вышеприведенном зрения я get 'ПЕРВИЧНЫЙ КЛЮЧ должен быть уникальным'. Что я делаю не так? Это строка «album = event», которая вызывает ошибку.

Окончательное решение после коррекции:

def save(self, force_insert=False, force_update=False, **kwargs): 
    """Save image dimensions.""" 
    super(Photo, self).save(force_insert, force_update, **kwargs) 
    im = PImage.open(pjoin(MEDIA_ROOT, self.image.name)) 
    self.width, self.height = im.size 

    self.create_thumbnail() 
    force_insert = False 
    force_update = True 

    super(Photo, self).save(force_insert, force_update, **kwargs) 
+0

У вас есть автоинкремент, установленный в поле основного ключа? –

+0

Его там по умолчанию правильно? – toothie

+0

Было бы разумно проверить. Также см. Эту ссылку https://groups.google.com/forum/#!topic/django-users/ALDujJRr0Ko –

ответ

3

Из беседы с Моникой: проблема в (не писал) Photo.save() метод, который делает два вызова super().save(), проходящие одни и те же аргументы в обоих случаях, поэтому первый вызов правильно создает экземпляр Photo, а второй пытается вставить его снова, что явно не получается.

Решение (для тех, кто с той же проблемой): Dont вслепую пройти *args и **kwargs к Model.save() когда ваша перегружать его и в конечном итоге вызывая его во второй раз.

class Foo(models.Model): 
    def save(self, force_insert=False, force_update=False, **kwargs): 
     super(Foo, self).save(force_insert, force_update, **kargs) 
     if somethings_needs_to_be_done: 
      do_something_here() 
      super(Foo, self).save(force_insert=False, force_update=True, **kwargs) 
+0

Вот исправленный save(): def save (self, force_insert = False, force_update = False, ** kwargs): "" "Сохранить размер изображения. "" " super (Фото, self) .save (force_insert, force_update, ** kwargs) im = PImage.open (pjoin (MEDIA_ROOT, self.image.name)) self.width, self.height = im.size self.create_thumbnail() force_insert = False force_update = True супер (фото, само) .save (force_insert, force_update, ** kwargs) – toothie

+0

@Monique: измените ваш оригинальный пост и поставить этот in - комментарий уничтожает все форматирование;) –

Смежные вопросы