2017-10-12 20 views
0

私はhttps://github.com/coderholic/django-citiesを使用しています。私はシリアライザに都市と国を追加したいと考えていました。Django <object>はJSONシリアライズ可能ではありません

これは私のモデルである:私はそれは私が取得しています動作するかどうかを確認しようとしているときに

class LocationsView(generics.ListAPIView): 
    queryset = Location.objects.order_by('-id') 
    serializer_class = LocationsSerializer 

serializers.py

class LocationsSerializer(serializers.ModelSerializer): 
    country = serializers.ReadOnlyField(source='city.country') 

    class Meta: 
     model = Location 
     fields = ['id', 'name', 'geolocation', 'city', 'country'] 

from cities.models import Country, City 

class Location(models.Model): 
    name = models.CharField(max_length=200, blank=True, null=True, default=None) 
    city = models.ForeignKey(City, blank=True, null=True, default=None, related_name='city_of_location') 
    geolocation = map_fields.GeoLocationField(max_length=100, blank=True, default='') 

私の見解:

<Country: Austria> is not JSON serializable 
+1

はどのように「それが動作するかどうか見て」いますか? –

+0

GeoJSONシリアライザが必要なのでしょうか? https://docs.djangoproject.com/en/1.11/ref/contrib/gis/serializers/それがあなたとあなたのrequirements.txtと呼ぶ方法を見る助けになります –

+0

@DanielRoseman私はhttp://127.0.0.1にアクセスしています:8000/locations /これは私がjsonを見なければならない場所です。シリアライザでシティーと国を追加するまではすべて動作しました –

答えて

1

ネストされた関係をシリアル化するには、CountrySerializerを定義する必要があります。

class CountrySerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Country 
     fields = '__all__' 

class LocationsSerializer(serializers.ModelSerializer): 
    number_of_rooms = serializers.SerializerMethodField() 
    country = CountrySerializer(source='city.country') 

    class Meta: 
     model = Location 
     fields = ['id', 'name', 'geolocation', 'city', 'country'] 

それとも、唯一の国番号が必要な場合は、PrimaryKeyRelatedFieldを使用することができます。

country = PrimaryKeyRelatedField(source='city.country') 
+0

私は今:/ locations/ にAssertionErrorを設定しています(「 'fields'属性または 'exclude'属性のいずれかを持たないModelSerializerを作成することは3.3.0以降廃止されました。すべての__ 'をCountrySerializerシリアライザに追加します。 "、) –

+0

@NitaAlexandruすべてのフィールドが必要な場合は、' CountrySerializer'にフィールドを指定するか、jsut 'fields =' __all__ ''を追加する必要があります。アップデートを参照してください。 – neverwalkaloner

+0

aha、それが動作するかどうか見せてください –

関連する問題