2015-12-23 1 views
0

Модель системы имеет модель . Модель партии.Как построить значение поля в модели, полученное из значений в другой модели.

class Party(models.Model): 
    name = models.CharField(max_length=128) 
    our_reference = models.CharField(max_length=128) 

Peter является стороной, а другой человек с тем же именем также называют Петром. Поле «our_reference» должно использовать первые три символа, за которым следует int, как PET1. Второй Петр будет PET2. Добавляется третий человек, называемый Петрас. Он будет PET3.

Использование модуля Левенштейна (https://rawgit.com/ztane/python-Levenshtein/master/docs/Levenshtein.html), мы должны проверить, при вставке партии, существует ли уже эта партия, как -

def get_similar_items(mod, field, string, similarity_ratio=0.6, limit=None): """ Get similar items for a specific model Example usage: similar = get_similar_items(Entry, 'title', 'Espresso is good for you', 0.5, 10) var = Entry.objects.filter(id__in=similar) """ similar_list_id = [] v = ContentType.objects.get_for_model(mod) c = v.model_class() for i in c.objects.all(): if ratio(string, getattr(i,field)) > similarity_ratio: similar_list_id.append(i.id) return similar_list_id[:limit] видели на https://djangosnippets.org/snippets/288/

Если партия существует, дон» t используйте новый номер int, но используйте старый, то есть PET1 в качестве ссылки. Если сторона не существует, сделайте новую ссылку PET4.

Вопрос был изменен, чтобы сделать очиститель для использования. Как реализовать?

+0

В конце концов решили пойти с простым решением - используйте UUID, как предложено knelson, и обычную последовательность postgres. 'code' – INTINV

ответ

0

Похоже, что вместо добавления инициалов партии и номера инструкций в одном поле с именем our_reference было бы лучше сохранить только ссылочный номер, так как вы можете вытащить инициалы из fk на сторону.

Это значительно увеличило бы количество инструкций.

Так что измените our_reference на поле int.

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

Если сторона не существует, создайте ее и возьмите первые три символа имени, str(party.name[3:]).upper().

Чтобы получить новые номера инструкций, вы можете найти все инструкции, которые сторона уже использует related_names.

Написать что-то вдоль линий:

new_instruction_number_for_party = макс (. Party.instructions.all() values_list ('our_reference')) + 1

Наконец, при отображении всего ссылку на файл в шаблоне, добавьте как our_reference, так и первые три буквы в контекст и вставляйте шаблон {{ party_initials }}{{ num_of_initial }}/{{ our_reference }}.

+0

UUID используются таким образом, чтобы внешний ключ не работал из коробки - я понимаю, что работа UUID лучше подходит для многопользовательских платформ. Приведёт ваш подход к bash и опубликует решение, если смогу. – INTINV

+0

Я возвращаюсь к исходному вопросу, потому что это правильный способ сделать это. @knelson говорит, что ** Возможно, у вас есть идентификатор, отличный от имени, поскольку два человека могут иметь одно и то же имя **. В этом суть; многие люди имеют одно и то же имя и фамилию, то же самое относится к организациям. Таким образом, возможно, человек/организация идентифицируется первой частью идентификатора, то есть DOE1. Другой человек с тем же именем будет идентифицирован DOE2.В DOE1 может быть несколько файлов, то же самое для DOE2. – INTINV

+0

[name_tools] (https://pypi.python.org/pypi/name_tools) обеспечивает меру сходства между двумя именами. Возможно, используйте [python_nameparser] (https://github.com/derek73/python-nameparser) для обработки конкатенированных полей, а затем перейдите к name_tools, чтобы проверить, существует ли данное лицо. – INTINV