Похоже, ваша ошибка возникла из-за того, что вы не указали basename
для своего маршрута в /app/really_simple_contact_management/urls.py
:
router.register(r'people', PersonViewSet)
Из документов :
basename - База для использования в именах URL, которые создаются. Если не задано, базовое имя будет автоматически сгенерировано на основе атрибута набора запросов в наборе, если таковое имеется. Обратите внимание, что если набор представлений не включает атрибут набора запросов, вы должны установить базовое имя при регистрации набора.
blockquote>
Замените строку выше на:
router.register(r'people', PersonViewSet, base_name='people',)
Укажите значимую строку как base_name
в соответствии с вашими предпочтениями, и ошибка должна исчезнуть.
Вы вручную создаете и возвращаете set
, но функция get_queryset
ожидала фактический Django QuerySet .
Вы можете переписать свою функцию, используя оператор __in
:
def get_queryset(self):
user = self.request.user
allowed_lists = get_objects_for_user(user, ('view_list'), klass=List)
return Person.objects.filter(member__in=allowed_lists)
Автоматический сгенерированный идентификатор может вызвать проблемы в ситуациях, где Вы используете репликацию (поскольку я уверен методы, которые Вы нашли, может!). В этих случаях я обычно выбираю GUID.
, Если Вы вряд ли будете использовать репликацию, затем автопостепенное увеличение, PK будет, скорее всего, работать просто великолепно.
Вот вещь с автоматическими целыми числами постепенного увеличения как ключи:
Вы, должно быть, отправили запись, прежде чем Вы получите доступ к ней. Это означает, что, пока Вы не отправили запись, Вы не можете, например, подготовить связанные записи, которые будут сохранены в другой таблице или любом из большого количества других возможных причин, почему могло бы быть полезно иметь доступ к уникальному идентификатору новой записи, прежде, чем отправить его.
Вышеупомянутое является моим решающим фактором, пойти ли с одним методом или другим.
Для клиентов полезно смочь предварительно выделить целый набор идентификаторов, чтобы сделать объемную вставку, не имея необходимость затем обновлять их локальные объекты со вставленными идентификаторами. Затем существует целая проблема репликации, как упомянуто Galwegian.
Метод процедуры постепенного увеличения должен быть ориентирован на многопотоковое исполнение. В противном случае Вы не можете получить уникальные числа. Кроме того, это должно быть быстро, иначе это будет узкое место приложения. Созданные в функциях уже приняли эти два фактора во внимание.
от CodingHorror:
Профессионалы GUID
Недостатки GUID
, статья предоставляет много хороших внешних ссылок при принятии решения о GUID по сравнению с Автоматическим Инкрементом. Если я могу, я пойти с GUID.
Мой основной вопрос с автопостепенным увеличением ключей - то, что они испытывают недостаток в любом значении
, Это требование первичного ключа в моем уме - чтобы не иметь никакой другой причины существовать кроме идентификации записи. Если это не имеет никакого реального значения, то это не имеет никакой реальной причины измениться. Вы не хотите, чтобы первичные ключи изменились, вообще говоря, потому что у Вас есть к поисковой замене своя целая база данных или хуже. Я был удивлен видами вещей, которые я принял, было бы уникально и неизменен, которые не оказались несколько лет спустя.
Нет ничего по сути неправильно с использованием AutoNumber, но существует несколько причин не сделать это. Однако, прокрутка Вашего собственного решения не является лучшей идеей, как dacracot упомянутый. Позвольте мне объяснить.
первая причина не использовать AutoNumber на каждой таблице является Вами, может закончить тем, что объединил записи от нескольких таблиц. Скажите, что у Вас есть таблица Sales Order и некоторый другой вид таблицы порядка, и Вы решаете вытащить некоторые общие данные, и использовать несколько представляют наследование в виде таблицы. Хорошо иметь первичные ключи, которые глобально уникальны. Это подобно тому, какой bobwienholt, сказанный об объединяющихся базах данных, но это может произойти в базе данных.
112-секундный, другие базы данных не используют эту парадигму, и другие парадигмы, такие как последовательности Oracle являются путем лучше. К счастью, возможно подражать последовательностям Oracle с помощью SQL Server. Один способ сделать это должно составить единственную таблицу AutoNumber для Вашей всей базы данных, названной MainSequence, или что бы то ни было. Никакая другая таблица в базе данных не будет использовать автонумерацию, но любого, которому нужен первичный ключ, сгенерированный, автоматически будет использовать MainSequence для получения его. Таким образом, Вы получаете все созданные в производительности, блокировке, потокобезопасности, и т.д. что dacracot говорил о, не имея необходимость создавать ее сами.
Другая опция использует GUID для первичных ключей, но я не рекомендую, чтобы, потому что, даже если Вы уверены, человек (даже разработчик) никогда не собирается читать их, кто-то, вероятно, был, и это твердо. И что еще более важно, вещи неявно бросают к ints очень легко в T-SQL, но могут испытать много затруднений, неявно бросив к GUID. В основном они неудобны.
В создании новой системы, я рекомендовал бы использовать специализированную таблицу для поколения первичного ключа (точно так же, как Oracle упорядочивает). Для существующей базы данных я не старался бы изо всех сил изменять его.
Ответ Galwegian не обязательно верен.
MySQL With можно установить ключевое смещение для каждого экземпляра базы данных. При объединении этого с достаточно большим инкрементом, он будет для штрафа. Я уверен, что у других поставщиков были бы своего рода подобные настройки.
Позволяет, говорят, что у нас есть 2 базы данных, которые мы хотим копировать. Мы можем настроить его следующим образом.
increment = 2
db1 - offset = 1
db2 - offset = 2
Это означает, что
db1 будет иметь ключи 1, 3, 5, 7....
db2 будет иметь ключи 2, 4, 6, 8....
Поэтому мы не будем иметь, включают столкновения, вставляет.
Мой основной вопрос с автопостепенным увеличением ключей - то, что они испытывают недостаток в любом значении.
таблицы For, где определенные поля обеспечивают уникальность (или один или в сочетании с другим), я выбрал бы использование этого вместо этого.
Полезная дополнительная льгота использования первичного ключа GUID вместо автоувеличивающего - то, что можно присвоить значение PK для новой строки на стороне клиента (на самом деле, необходимо сделать это в сценарии репликации), экономя Вас стычка получения PK строки, Вы просто прибавили сервер.
Одна из оборотных сторон PK GUID - то, что соединения на поле GUID медленнее (если это недавно не изменилось). Другой позитивный аспект использования GUID - то, что это интересно попытаться объяснить нетехническому менеджеру, почему коллизия GUID довольно маловероятна.
Единственная настоящая причина, чтобы сделать это должно быть агностиком базы данных (если различные версии дб используют различные методы автоматической нумерации).
другой проблемой, упомянутой здесь, является способность создать записи в нескольких местах (как в центральной станции, а также при ноутбуках пользователей перемещения). В этом случае, тем не менее, Вам, вероятно, было бы нужно что-то как "sitecode", который был уникален для каждой установки, которая была снабжена префиксом к каждому идентификатору.
Единственная причина, о которой я могу думать, состоит в том, что код был написан, прежде sequences
были изобретены, и код забыл нагонять ;)
Другая потенциальная причина состоит в том, что Вы сознательно хотите случайные ключи. Это может быть желательно, если, скажем, Вы не хотите любопытные браузеры, пролистывающие каждый объект, Вы имеете в базе данных, но не достаточно очень важно гарантировать фактические меры по защите аутентификации.
Я предпочел бы использовать GUID для большинства сценариев, в которых существующий метод сообщения имеет любой смысл мне (репликация, являющаяся возможной). Если бы репликация была проблемой, то такая хранимая процедура должна была бы знать о другом сервере, который должен был бы быть связан для обеспечения ключевой уникальности, которая сделает это очень хрупким и вероятно плохой способ сделать это.
Одна ситуация, где я использую целочисленные первичные ключи, которые НЕ автоувеличивают идентификационные данные, имеет место редко измененных справочных таблиц, которые осуществляют ограничения внешнего ключа, которые будут иметь соответствующее перечисление в использующем данные приложении. В том сценарии я хочу удостовериться, что перечислимое отображение будет корректно между разработкой и развертыванием, особенно если будет несколько серверов напоминания.
Используя уникальные идентификаторы позволили бы Вам объединять данные из двух различных баз данных.
, Возможно, у Вас есть приложение, которое собирает данные в нескольких база данных и затем "синхронизирует" с основной базой данных неоднократно в день. Вы не должны были бы волноваться о коллизиях первичного ключа в этом сценарии.
Или, возможно, Вы могли бы хотеть знать то, чем идентификатор записи будет перед фактическим созданием его.
Одно преимущество - то, что это может позволить базе данных/SQL быть более межплатформенной. SQL может быть точно тем же на SQL Server, Oracle, и т.д.