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
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. –
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
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