2015-05-12 4 views
1

Я разработчик django, мы работаем над 1.3. Теперь хотелось попробовать последнюю версию, т.е. 1.8.1. Поскольку существует много изменений с 1.3 до 1.8.1. Хотел узнать, есть ли в Django PhoneField, который должен хранить несколько телефонных номеров в одном поле. Я думал об использовании поля JSON для этой цели, какМодели Django-Лучший способ хранения нескольких контактных номеров

  • Если поддерживать несколько номеров
  • Если поддерживать «-» в количестве
  • Если поддерживать коды стран, как + XX
  • Если поддержка regx проверки для номера телефона.

С полем JSON я мог бы легко достичь этого, но для проверки правильности потребуется отдельная функция.

contact_info = json.JSONField("ContactInfo", default=contact_default) 

Я нашел this, но не думаю, что сильно отличается от текстового поля.

ответ

1

Если вы используете PostgreSQL вы можете использовать ArrayField.

contact_info = ArrayField(models.CharField(max_length=15), blank=True) 

Официальная документация здесь. ArrayField

+0

Спасибо за документацию, которая также предоставила мне еще один вариант i.e HStoreField – trex

1

Вы можете создать функцию, которая проверяет номера перед сохранением на JSONField или HStoreField.

Пример:

import re 

def validate_phone_number(phone_number): 
    valid_number_pattern = re.compile(r'^(\d{3})-(\d{3})-(\d{4})$') 

    is_valid = re.match(valid_number_pattern, phone_number) 

    if not is_valid: 
     return False 
    else: 
     return True 

def save_number(request): 
    if request.METHOD == 'POST': 
     phone_number = request.POST['number'] 
     is_valid = validate_phone_number(phone_number) 
     if not is_valid: 
      messages.error(request, 'Error, your phone number is not valid!') 
      return redirect('main:add_number') 
     else: 
      [... Add the number(s) to the model's JSONField here ...] 
      messages.success(request, 'Success!') 
      return redirect('main:index') 

Или, вы можете использовать более сложные регулярные выражения из выбранного правильного ответа здесь: https://stackoverflow.com/a/3868861/3345051

+1

Благодарим за усилия. Это был мой последний вариант. +1 для готового ответа. – trex

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