2015-05-05 7 views
12

Bu soru, daha iyi baktıktan sonra kendim tarafından SOLVED olmuştur. Lütfen cevabımı aşağıya oku.Python/Django Rest Framework Sadece hata ayıklayıcısını kullanırken oluyor garip hata


ben bir "fields seçenek listesi veya tanımlama grubu olmalıdır. Got str." Alıyorum Django uygulamamı çalıştırırken. Tam olarak aynı kodu hata ayıklayıcısında çalıştırarak ve hata satırında bir kesme noktam varsa, o zaman başarısız olur ve bir tuple olması gereken bir tuple gibi görünür. ...

hives = profile.hive_subscriptions 
    # En fields se le pasa el campo a eliminar del serializador 
    fields = ('priority',) 
    serializer = serializers.ChHiveLevel1Serializer(hives, fields=fields, many=True) 
    ... 

Ve şudur:

def __init__(self, *args, **kwargs): 
    # Don't pass the 'fields' arg up to the superclass 

    fields = kwargs.pop('fields', None) 

    # Instantiate the superclass normally 
    super(ChHiveLevel1Serializer, self).__init__(*args, **kwargs) 

    if fields is not None: 
     # Drop fields that are specified in the `fields` argument. 
     for field_name in fields: 
      self.fields.pop(field_name) 
      print("fields to be included: ", self.fields) 

views.py ben sadece yapın:

Sorun DRF ModelSerializer içine aşağıdaki kodu yer alması gibi görünüyor geri izleme:

Internal Server Error: /profiles/diegoocampo8/hives/ 
    Traceback (most recent call last): 
     File "/home/diego/virtualenvs/chattyhive3.3.4/lib/python3.3/site-packages/django/core/handlers/base.py", line 111, in get_response 
     response = wrapped_callback(request, *callback_args, **callback_kwargs) 
     File "/home/diego/virtualenvs/chattyhive3.3.4/lib/python3.3/site-packages/django/views/decorators/csrf.py", line 57, in wrapped_view 
     return view_func(*args, **kwargs) 
     File "/home/diego/virtualenvs/chattyhive3.3.4/lib/python3.3/site-packages/django/views/generic/base.py", line 69, in view 
     return self.dispatch(request, *args, **kwargs) 
     File "/home/diego/virtualenvs/chattyhive3.3.4/lib/python3.3/site-packages/rest_framework/views.py", line 452, in dispatch 
     response = self.handle_exception(exc) 
     File "/home/diego/virtualenvs/chattyhive3.3.4/lib/python3.3/site-packages/rest_framework/views.py", line 449, in dispatch 
     response = handler(request, *args, **kwargs) 
     File "/home/diego/PycharmProjects/chattyhive/API/views.py", line 271, in get 
     serializer = serializers.ChHiveLevel1Serializer(hives, fields=fields, many=True) 
     File "/home/diego/virtualenvs/chattyhive3.3.4/lib/python3.3/site-packages/rest_framework/serializers.py", line 96, in __new__ 
     return cls.many_init(*args, **kwargs) 
     File "/home/diego/virtualenvs/chattyhive3.3.4/lib/python3.3/site-packages/rest_framework/serializers.py", line 116, in many_init 
     child_serializer = cls(*args, **kwargs) 
     File "/home/diego/PycharmProjects/chattyhive/API/serializers.py", line 274, in __init__ 
     print("fields to be included: ", self.fields) 
     File "/home/diego/virtualenvs/chattyhive3.3.4/lib/python3.3/site-packages/rest_framework/utils/serializer_helpers.py", line 120, in __repr__ 
     return dict.__repr__(self.fields) 
     File "/home/diego/virtualenvs/chattyhive3.3.4/lib/python3.3/site-packages/rest_framework/serializers.py", line 611, in __repr__ 
     return unicode_to_repr(representation.list_repr(self, indent=1)) 
     File "/home/diego/virtualenvs/chattyhive3.3.4/lib/python3.3/site-packages/rest_framework/utils/representation.py", line 97, in list_repr 
     if hasattr(child, 'fields'): 
     File "/home/diego/virtualenvs/chattyhive3.3.4/lib/python3.3/site-packages/rest_framework/serializers.py", line 313, in fields 
     for key, value in self.get_fields().items(): 
     File "/home/diego/virtualenvs/chattyhive3.3.4/lib/python3.3/site-packages/rest_framework/serializers.py", line 837, in get_fields 
     field_names = self.get_field_names(declared_fields, info) 
     File "/home/diego/virtualenvs/chattyhive3.3.4/lib/python3.3/site-packages/rest_framework/serializers.py", line 889, in get_field_names 
     type(fields).__name__ 
    TypeError: The `fields` option must be a list or tuple. Got str. 
    [05/May/2015 17:30:34] "GET /profiles/diegoocampo8/hives/ HTTP/1.1" 500 136024 

sonra print("fields to be included: ", self.fields) kaldırırsanız aldım aynı hata ama hala Python bir çaylak ve ben çok yanlış bir şey yapıyor olabilir, ama eklerseniz neden olduğunu anlayamıyorum olduğunu

Tamam views.py hat serializer = serializers.ChHiveLevel1Serializer(hives, fields=fields, many=True) işaret eder Ben sadece bahsettiğim baskı, ve ben hata ayıklama ile aynı api isteği yapmak, sonra sadece çalışır: Yanıtımı istediğim gibi alıyorum ve herhangi bir hata (kesme noktası hata ayıklayıcı ile başlatılsa bile tekrar hata verecektir.

Neyin yanlış olabileceğine dair bir fikriniz var mı? Şimdiden çok teşekkürler. İhtiyacın olursa, ekstra bilgi için bana sorun!

DÜZENLEME: Daha açıklamalar:

bütün serileştirici şudur:

class ChHiveLevel1Serializer(serializers.ModelSerializer): 
    """Used by the following API methods: GET hive list, 

    """ 
    category = serializers.SlugRelatedField(read_only=True, slug_field='code') 
    languages = serializers.SlugRelatedField(source='_languages', many=True, read_only=True, slug_field='language') 

    # If in the POST we only need to establish the relationship with User model (not update the model itself) we 
    # set read_only to True 
    creator = serializers.SlugRelatedField(read_only=True, slug_field='public_name') 
    tags = serializers.SlugRelatedField(many=True, read_only=True, slug_field='tag') 
    public_chat = ChPublicChatLevel1Serializer(many=False, read_only=True) 
    community_public_chats = ChCommunityPublicChatLevel1Serializer(many=True, read_only=True) 

    subscribed_users_count = serializers.IntegerField(source='get_subscribed_users_count', read_only=True) 

    def __init__(self, *args, **kwargs): 
     # Don't pass the 'fields' arg up to the superclass 

     fields = kwargs.pop('fields', None) 

     # Instantiate the superclass normally 
     super(ChHiveLevel1Serializer, self).__init__(*args, **kwargs) 

     if fields is not None: 
      # Drop fields that are specified in the `fields` argument. 
      for field_name in fields: 
       self.fields.pop(field_name) 
       print("fields to be included: ", self.fields) 

    class Meta: 
     model = ChHive 
     fields = ('name', 'slug', 'description', 'category', 'languages', 'creator', 'creation_date', 'tags', 
        'priority', 'type', 'public_chat', 'community_public_chats', 'subscribed_users_count') 

Ben onun kafa karıştırıcı biliyorum 3 farklı 'alanlar' bu yüzden bu netleştirmek: görünümlerinde

Ben diziselleştiriciye bir 'param' parametresi geçiriyorum, bu serileştiriciden dinamik olarak çıkarılacak alanların isimlerini içeren bir tuple. Daha sonra init'un içinde bu paramın dışına çıkıyorum (bu yüzden süper sınıfa gönderilmez) ve yerel tuple 'alanlarını' atayım. Son olarak, 'eğer alanlar Yok' ise, self.fields 'dan (bunlar serileştiricide tanımlanan alanlar) yerel tuple dahilindeki isimlere sahip alanları siliyorum. Umarım şimdi daha iyi açıklayabilirim. ÇÖZÜM http://youtu.be/RImEMebBGLY

+1

Bu hatayı aldınız çünkü DRF, seri hale getiricinizin alanlarının dize olarak gösterimini yazdırmaya çalışırken yanlış bir şey oldu. Tüm serileştiricinizi yapıştırır mısınız lütfen? Böylece neyin yanlış olduğunu anlamaya çalışabilirim. –

+1

Kodun izlenmesi zor. 3 farklı 'alan' ismi var gibi görünüyor: self.fields, __init __() 'de' fields 've ChHiveLevel1Serializer.Meta.fields. TypeError istisnası ChHiveLevel1Serializer.Meta.fields denetliyordu. Üçünü kullanmanın nedenini düşünürseniz ve açıklarsanız, sizi bir düzeltmeye götürebilir. Bir kesme noktası ayarladığınızda davranışı WRT, yürütmenin gerçekten kesme noktasında durup durmadığını ve kesme noktasından devam edip etmediğinizi söylemediniz. Bir iş parçacığı/istek kesme noktasında durdu ve bir sonraki başarılı oldu. – nmgeek

+0

Biraz daha bilgi ekledim. Kesme noktaları hakkında: evet, uygulama kesme noktasında durdu ve sonra yürütme sürdürdü ve yapıyorum REST API'sinden beklenen yanıtı aldım. Ayrıca sorunu gösteren bir video bağlantısı ekledim: http://youtu.be/RImEMebBGLY – diegopau

cevap

3

: Her şeyden önce o pydevd veya Django istirahat Çerçevesi biriyle bir hata olduğunu bana öyle geliyor, yapılan Burada

ayıklama ve çok işe yarıyor kesme noktasında durulduğunda gösteren bir video kodum hata ayıklama modundayken ve kesme noktalarında durduğunda çalışır (videoda gösterilir). Ama Django/Python'da uzman değilim, bu yüzden beklenen davranış olabilir. Yukarıdaki kodda görüldüğü gibi, ChHiveLevel1Serializer serileştiricisi, bunlardan biri olan, örneğin, PublicChatLevel1Serializer gibi iç içe geçmiş serileştiricilere sahiptir.

class ChCommunityPublicChatListLevel1Serializer(serializers.ModelSerializer): 
"""Used by the following API methods: GET hive list, 

""" 
    chat = serializers.SlugRelatedField(read_only=True, slug_field='chat_id', allow_null=True) 

    class Meta: 
     model = ChCommunityPublicChat 
     fields = ('chat') 

hata belirttiğimiz gibi alanlar yerine tuple bir dize olarak tanımlanır: Bu serileştirici nasıl göründüğünü görelim. Doğru formu olacaktır: Ben ben bu başlığın tanımlanmış nasıl bir hata yaptığını kabul ederken ON konumundayken debugger ile, sadece işe neden

class ChCommunityPublicChatListLevel1Serializer(serializers.ModelSerializer): 
"""Used by the following API methods: GET hive list, 

""" 
    chat = serializers.SlugRelatedField(read_only=True, slug_field='chat_id', allow_null=True) 

    class Meta: 
     model = ChCommunityPublicChat 
     fields = ('chat',) 

, hala anlayamıyorum. (hata ayıklayıcısını kullanarak ve kesme noktalarında durduğunda olduğu gibi, aniden (dizge yerine) bir tuple olarak yorumlanır ('sohbet').