2016-11-22 10 views
0

をtypeof演算子を得ます。私はすべての製品をフロントエンドに返す。これは、基本的に、製品固有の属性のみを持つ製品オブジェクトをフロントエンドに送信するため、どの製品がPubで、どの製品がRestaurantであるかを区別することは困難です。Djangoの継承は、私は次のような三つのモデルている基本クラスから

バックエンドでこれをどのように処理できますか?製品のタイプも抽出/送信する方法はありますか?

これは以下のように私の見解がどのように見えるかです:それは、例えば返す

@api_view(('GET',)) 
def show(request): 
    cart = Cart(request.session) 
    products = cart.products 
    serializer = ProductSerializer(products, many=True) 
    return Response(serializer.data) 

[{"id":1,"name":"Shreyas","price":"45000.00000","avg_user_rating":"4.50000","city":1},{"id":4,"name":"Phadake","price":"350.00000","avg_user_rating":"5.00000","city":2}] 

シリアライザ:

class ProductSerializer(serializers.ModelSerializer): 
    category = serializers.ReadOnlyField() 
    class Meta: 
      model = Product 
      fields = '__all__' 

答えて

1

オプション1

があなたにverbose_nameでモデルをMetaクラスを追加します。

class Pub(Product): 
    product = models.OneToOneField(Product, parent_link=True,) 
    seating_capacity = models.IntegerField(null=False, verbose_name="Seating capacity of the Pub",) 

    class Meta: 
     verbose_name = 'Pub' 

class Restaurant(Product): 
    product = models.OneToOneField(Product, parent_link=True,) 
    food_speciality = MultiSelectField(choices = MY_CHOICES) 

    class Meta: 
     verbose_name = 'Restaurant' 

ProductSerializerにこれらの行を追加します。

category = serializers.SerializerMethodField() 

def get_category(self, obj): 
    return obj._meta.verbose_name 

オプションまたは2

、あなたは各モデルにpropertyを追加することができます。

class Pub(Product): 
    product = models.OneToOneField(Product, parent_link=True,) 
    seating_capacity = models.IntegerField(null=False, verbose_name="Seating capacity of the Pub",) 

    @property 
    def category(self): 
     return 'Pub' 

class Restaurant(Product): 
    product = models.OneToOneField(Product, parent_link=True,) 
    food_speciality = MultiSelectField(choices = MY_CHOICES) 

    @property 
    def category(self): 
     return 'Restaurant' 

その後ProductSerializerに次の行を追加します。もちろん

category = serializers.ReadOnlyField() 

オプション3

を、あなたはまた、オプションを持っているあなたは、メタまたはプロパティを追加したくない場合は、これを行いますあなたのモデルに:

def get_category(self, obj): 
    return obj.__class__.__name__ 

しかし、tあなたは、すべてのカテゴリがクラスの名前と同じになるという制限がありますが、これは問題である可能性があります。

+0

ありがとうございます!私はそれを試みます。 – Nitish

+0

オプション2を使用してシリアライザを更新しましたが、同じ応答が返されました。シリアライザコードで質問を更新しました。どうぞご覧ください。 – Nitish

+0

シリアライザのメタから 'fields = '__all __''を削除します。それぞれのモデルに 'category'プロパティを追加するのを忘れましたか? – lucasnadalutti

関連する問題