DjangoRestFramework - 如何将不同序列化器的结果合二为一

时间:2015-05-17 20:38:31

标签: python django django-rest-framework django-serializer

我有4-5个型号如下: -

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="button" />

<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="edit text" />

同样,我使用class Product(models.Model): title = models.CharField(max_length=255) short_description = models.TextField(blank=True,null=True) video_link = models.URLField(blank=True,null=True) price = models.IntegerField(db_index=True,blank=True,null=True) user = models.ForeignKey(User) @staticmethod def get_product_details(product,category=None,image=None,comment=None,rating=None): product_detail = { 'id' : product.id, 'title' : product.title, 'short_description' : product.short_description, 'video_link' : product.video_link, 'price' : product.price, 'user' : product.user.first_name + ' ' + product.user.last_name, } if category: product_detail.update({'categories': ProductCategory.get_product_categories(product)}) if comment: product_detail.update({'comments' : ProductComments.get_product_comments(product)}) if image: product_detail.update({'images': ProductImages.get_product_images(product)}) if rating: product_detail.update({'rating': ProductRating.return_data(product)}) return product_detail class ProductCategory(models.Model): subcategory = models.CharField(max_length=255) product = models.ForeignKey(Product) date = models.DateTimeField(auto_now_add=True) @staticmethod def get_product_categories(product): return ProductCategory.objects.filter(product=product).values_list('subcategory',flat=True) 作为FK引用的多个模型(例如ProductProductImages等),我需要从中获取数据然后集中显示在获取特定产品的数据时使用ProductCommentsProduct模型下。

因此,如果我浏览到get_product_details,它将调用localhost:8080/product/<product_id>,它将调用模型中的其他方法来收集get_product_details的信息参考。

是否可以在Django-Rest-Framework中创建一个序列化程序,它将从其他序列化程序获取引用特定产品对象的数据。??

以下是我的序列化工具。

<product_id>

我期待的是这样的: -

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product


class ProductCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = ProductCategory

我的预期输出应采用以下格式: -

class ProductSerializer(serializers.ModelSerializer):
        class Meta:
            model = Product
            include_data_models = (ProductCategory,ProductImages,)

1 个答案:

答案 0 :(得分:0)

假设您使用的是Django REST Framework v3.0 +,我建议您查看Django REST Framework Documentation on Serializer Relations。此外,您还需要在models.ForeignKey字段中使用ForeignKey.related_name

模型

class Product(models.Model):
    title = models.CharField(max_length=255)
    short_description = models.TextField(blank=True,null=True)
    video_link = models.URLField(blank=True,null=True)
    price = models.IntegerField(db_index=True,blank=True,null=True)
    user = models.ForeignKey(
        to=User, 
        related_name="products",
    )

    ...


class ProductCategory(models.Model):
    subcategory = models.CharField(max_length=255)
    product = models.ForeignKey(
        to=Product, 
        related_name="categories",
    )
    date = models.DateTimeField(auto_now_add=True)

    ...

    def __unicode__(self):
        return self.subcategory  # Tech, Books, etc.

串行器

class ProductCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = ProductCategory


class ProductSerializer(serializers.ModelSerializer):
    # The related_name="categories" on the ProductCategory.product
    #    will allow us to retrieve categories, and convert it to
    #    the __unicode__ equivalent.
    # http://www.django-rest-framework.org/api-guide/relations/#stringrelatedfield
    categories = serializers.StringRelatedField(many=True)

    class Meta:
        model = Product