2013-06-04 2 views
0

Мне нужно проверить записи, добавляемые для тех же (content_type и object_id), чтобы убедиться, что они не дублируются в базе данных при сохранении.Проверка Django для дублированного content_type и object_id

class objectHere(models.Model): 
     """ 
     Notes: 


     See: http://www.screamingatmyscreen.com/2012/6/django-and-generic-relations/ 
     """ 
     content_type = models.ForeignKey(ContentType, help_text="Represents the name of the model") 
     object_id = models.PositiveIntegerField(help_text="stores the object id") 
     content_object = generic.GenericForeignKey('content_type', 'object_id') 

     reason = models.CharField(max_length=60) 

     request_made = models.DateTimeField(auto_now_add=True, 
             help_text="Shows when object was created.") 

Я думал о том, чтобы что-то делать с pre_save? Можно ли это сделать, если да, то как?

ответ

2

Вы можете сделать это в одном из нескольких способов я могу думать:

  1. The pre_save сигнала
  2. Override в модели save() method
  3. Добавление уникального ограничения на свойства модели Meta.
  4. Проверьте его в представлении или чистой методу формы в

Чистейший подход будет использовать unique_together на модели Meta. Однако, если вы не хотите запускать миграцию с моделями, я бы рекомендовал чистый метод просмотра/формы, если есть некоторые действия пользователя, которые потребуются для устранения ошибки.

1

Вы можете использовать unique_together meta option на модели:

class MyObject(models.Model): 
    content_type = models.ForeignKey() 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

    .... 

    class Meta: 
     unique_together = ["content_type", "object_id", ] 
+0

Я предполагаю, что unique_together должен быть кортежем вместо списка? –

+0

@AnkitJaiswal - Список тоже работает. Кортеж - это просто неизменное представление списка – karthikr

+0

@karthikr Ах! хорошо, не знал, что кортеж также работает там. Просто увидел документацию и прокомментировал здесь. –

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