2009-09-22 3 views
2

Хорошо, я работаю над приложением Django с несколькими различными моделями, а именно с учетными записями, контактами и т. Д., Каждый с другим набором полей. Мне нужно, чтобы каждый из моих пользователей мог определять свои собственные поля в дополнение к уже существующим полям. Я видел несколько различных способов реализовать это: от большого количества CustomFields и просто сопоставления настраиваемого имени для каждого поля, используемого каждым пользователем. Я также представляю рекомендации по реализации комплексного сопоставления или хранения/поиска стиля XML/JSON определенных пользователем полей.Как создать пользовательские поля в Django

Итак, мой вопрос в том, кто-нибудь внедрил определенные пользователем поля в приложении Django? Если да, то как вы это сделали и каков ваш опыт в общей реализации (стабильность, производительность и т. Д.)?

Обновление: Моя цель - разрешить каждому из моих пользователей создавать n номеров каждого типа записи (учетные записи, контакты и т. Д.) И связывать определяемые пользователем данные с каждой записью. Например, один из моих пользователей может связать SSN с каждым из своих контактов, поэтому мне нужно будет сохранить это дополнительное поле для каждой создаваемой им записи Contact.

Спасибо!

Mark

+0

Возможно, вы захотите уточнить свои цели. Вы хотите просто связать произвольные метаданные с этими пользователями или вам нужно искать пользователей по определенным полям? –

+0

Возможно, вам нужна эта ссылка: http://stackoverflow.com/a/7934577/497056 –

ответ

3

Что делать, если вы хотите использовать ForeignKey?

Этот код (непроверенный и для демонстрации) предполагает наличие общесистемного набора настраиваемых полей. Чтобы сделать его пользовательским, вы должны добавить в класс CustomField «user = models.ForiegnKey (Пользователь)».

class Account(models.Model): 
    name = models.CharField(max_length=75) 

    # ... 

    def get_custom_fields(self): 
     return CustomField.objects.filter(content_type=ContentType.objects.get_for_model(Account)) 
    custom_fields = property(get_fields) 

class CustomField(models.Model): 
    """ 
    A field abstract -- it describe what the field is. There are one of these 
    for each custom field the user configures. 
    """ 
    name = models.CharField(max_length=75) 
    content_type = models.ForeignKey(ContentType) 

class CustomFieldValueManager(models.Manager): 

    get_value_for_model_instance(self, model): 
     content_type = ContentType.objects.get_for_model(model) 
     return self.filter(model__content_type=content_type, model__object_id=model.pk) 


class CustomFieldValue(models.Model): 
    """ 
    A field instance -- contains the actual data. There are many of these, for 
    each value that corresponds to a CustomField for a given model. 
    """ 
    field = models.ForeignKey(CustomField, related_name='instance') 
    value = models.CharField(max_length=255) 
    model = models.GenericForeignKey() 

    objects = CustomFieldValueManager() 

# If you wanted to enumerate the custom fields and their values, it would look 
# look like so: 

account = Account.objects.get(pk=1) 
for field in account.custom_fields: 
    print field.name, field.instance.objects.get_value_for_model_instance(account) 
Смежные вопросы