2016-01-06 23 views
5

Dựa trên DRF documentation Tôi có một tạo ra một danh sách các EMAIL_ID lưu trữ trong mô hình của tôi theo cách sau Models.pyDjango Nghỉ ngơi Khung: cách chính xác để serialize ListFields

class UserData(models.Model): 
    emails = models.CharField(max_length=100,blank=False) 

Trong file serializers.py tôi

class UserSerializer(serializers.ModelSerializer): 
    emails = serializers.ListField(child = serializers.EmailField()) 

Khi đăng dữ liệu, trang drf hiển thị dữ liệu ở định dạng mong muốn, nghĩa là

"emails": [ 
     "[email protected]" 
    ], 

Nhưng, nếu tôi truy vấn cùng một dữ liệu bằng cách sử dụng python hoặc bất kỳ ứng dụng khách khác. Tôi lấy dữ liệu theo định dạng sau

data = json.load(urllib2.urlopen("http://localhost:8000/blah/id")) 
In [46]: d['emails'] 
Out[46]: 
[u'[', 
u'u', 
u"'", 
u'b', 
u'a', 
u'l', 
u'@', 
u'b', 
u'a', 
u'l', 
u'.', 
u'c', 
u'o', 
u'm', 
u"'", 
u']'] 

Lý tưởng nhất, nó cần phải có được

d['emails'] = ['[email protected]'] 

Tôi không chắc chắn, những gì chính xác là sai ở đây. Bất kỳ đề xuất ?

Trả lời

1

Mô hình của bạn chỉ có một trường email. Nó không hỗ trợ lưu trữ nhiều email trong cơ sở dữ liệu. Những gì bạn cần là một cái gì đó như thế này:

class UserEmail(models.Model) 
    user = models.ForeignKey('User', related_name='emails') 
    email = models.EmailField(unique=True) 

    # You can also store some other useful things here... 
    activated = models.BooleanField(default=False) # For example 


class User(models.Model): 
    ... 


class EmailSerializer(serializers.ModelSerializer): 
    class Meta: 
     fields = ['id', 'email'] 


class UserSerializer(serializers.ModelSerializer): 
    emails = EmailSerializer(many=True) 

Tuy nhiên, điều này sẽ dẫn đến một cấu trúc dữ liệu hơi khác nhau:

[{ 
    'someUserField': 'foobar', 
    'emails': [ 
     {'id': 1, 'email': '[email protected]'}, 
     {'id': 2, 'email': '[email protected]'}, 
    ] 
}, { 
    ... 
}] 

Nếu bạn không muốn cấu trúc dữ liệu này, bạn có thể tạo một custom field

Hoặc ... nếu bạn đang sử dụng postgresql bạn sẽ có thể để làm điều này:

from django.contrib.postgres.fields import ArrayField 

class UserData(models.Model): 
    emails = ArrayField(models.EmailField(), blank=True) 
+0

Tôi đã nghĩ về điều đó. Có quá nhiều rắc rối trong việc tạo ra một đến nhiều hiệp hội. Tôi muốn nó được lưu trữ như một mảng các id email. Một cách dễ dàng là hack thêm nhiều email bằng "," (dấu phẩy). Nhưng tôi hy vọng cho drf để cung cấp cho phản ứng json như mảng. – Rahul

+0

Vâng, vì bạn đang sử dụng django và một cơ sở dữ liệu quan hệ, đây chỉ là cách đúng đắn để làm việc. Tuy nhiên, nếu bạn đang sử dụng postgres, bạn có thể thử [JSON Field] mới (https://docs.djangoproject.com/en/1.9/ref/contrib/postgres/fields/#django.contrib.postgres.fields. JSONField) – demux

+0

DRF cũng rất linh hoạt và mã nguồn rõ ràng. Bạn có thể kéo tất cả các loại pha nguy hiểm điên rồ bằng các trường tùy chỉnh. Trong mọi trường hợp, 'CharField' không phải là lựa chọn đúng cho một trường nhiều email. Đọc này: [Trường danh sách Django trong mô hình] (http://stackoverflow.com/questions/22340258/django-list-field-in-model) – demux

Các vấn đề liên quan