2017-11-30 19 views
0

これまでずっと奇妙なエラーが発生しています。私たちのデベロッパーチームはこの二日間、これを実行していたので、それを乗り越えることはできません。Django QuerySet TypeError

def get_custom_fields(self, obj): 
    custom_fields = obj.company.ticketcustomfieldtype_set.all() 
    return [{ 
     'id': field.id, 
     'name': str(field.name), 
     'type': field.type, 
     'value': obj.custom_fields[str(field.id)] if str(field.id) in obj.custom_fields else None 
    } for field in custom_fields] 

custom_fields通常のDjangoのクエリセット

今奇妙なことがあります::

は、我々は、以下の機能を備えた当社のDRF・シリアライザを持っているローカルホスト上で、これはうまく動作します。リモートでは、QuerySetが空の場合にのみ正常に動作します。その中に何かがあれば、我々は次のエラーを取得する:

はTypeError:文字列のインデックスはcustom_fieldsが現在の文字列であることが表示されます、整数

enter image description here

でなければなりません。ローカルにそれだけで正常に動作しますので、私たちは

  • DjangoはPythonの3.4.3
  • DRF 3.6.4 1.11.5
  • ...、
  • のPostgres 9.6.5
を理由はわかりません

感謝すべてのヘルプ、必死:(

EDIT:

TicketCustomFieldTypeモデル:

class TicketCustomFieldType(models.Model): 
    TICKET_CUSTOM_FIELD_TYPES = (
     ('CHAR', _('Text field')), 
     ('DATE', _('Date field')) 
    ) 

    TICKET_DEFAULT_CUSTOM_FIELD_TYPE = 'CHAR' 

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True) 

    company = models.ForeignKey(
     to=Company, 
     verbose_name=_('Company') 
    ) 

    name = I18nCharField(
     verbose_name=_('Name'), 
     max_length=80, 
    ) 

    type = models.CharField(
     verbose_name=_('Field type'), 
     max_length=20, 
     choices=TICKET_CUSTOM_FIELD_TYPES, 
     default=TICKET_DEFAULT_CUSTOM_FIELD_TYPE, 
     help_text=_('In this field, you can store either text, or date value.'), 
    ) 

    priority = models.IntegerField(default=0) 

チケットモデル(略称):

from django.contrib.postgres.fields import JSONField 
from django.core.serializers.json import DjangoJSONEncoder 
(...) 
class Ticket(models.Model): 
    (...) 
    custom_fields = JSONField(encoder=DjangoJSONEncoder, default=dict, verbose_name=_('Custom fields')) 

    def get_custom_field(self, field_type): 
     qs = self.customfields.filter(type=field_type) 
     if qs.exists(): 
      return qs.first() 

     new_field = TicketCustomField() 
     new_field.ticket = self 
     new_field.type = field_type 
     new_field.save() 
     return new_field 

    def get_all_custom_fields(self): 
     custom_fields = [] 
     for type in self.company.ticketcustomfieldtype_set.all(): 
      custom_fields.append(self.get_custom_field(type)) 
     return custom_fields 

EDIT 2:

のPython 3.6にアップグレードした後、この問題は、コードへの変更を修正しないしまっ...

+0

ですので、これはあなたにそれを追加することができ、あります質問? – Daniel

+0

このエラーは、 'obj.custom_fields'はリストであり、辞書ではないことを示しています。したがって、 'obj.custom_fields [1]'は実行できますが、 'obj.custom_fields [str(1)]'はエラーを返します。 – Alasdair

+0

ありがとうございます。私はモデルを追加しました。 – petr

答えて

0

これを変更してください。

'value': obj.custom_fields[str(field.id)] if str(field.id) in obj.custom_fields else None 
これに

'value': obj.custom_fields[field.id] if str(field.id) in obj.custom_fields else None 

それは整数を期待しますが、何を提供していることあなたのモデル定義を見て参考にしたい文字列

+0

ありがとうございます。いいえ、これは問題ではありません。 'custom_fields'は' dict'でなければならず、その構造に間違いはありません。問題は 'custom_fields'は何らかの理由で' dict'ではなく 'string'です。このエラーは、リスト内のものであり、割り当て内のものではありません。 – petr

+0

はモデル構造を投稿できますか? obj.custom_fieldsを呼び出していますが、これは何を返しますか? – rajkris

+0

ありがとうございます。私はモデルを追加しました。 – petr

関連する問題