簡體   English   中英

嵌套序列化器連接外鍵但字段為空 - django-rest-framework

[英]Nested Serializer Connects with Foreign Keys but Fields Comes Empty - django-rest-framework

我有一個獲取產品 model 的視圖,里面有一些字段引用另一個表(外鍵)。 所以我想要一個嵌套字段也是一個 json 導出格式。 我想要一個導出,我也可以看到另一個表引用

視圖.py

class ExportDataViewDeneme3(APIView):
    permission_classes = ()
    def post(self, request):
        model_list = ["Products"]
        # Get the foreign key id from the request
        dagRunId = request.data.get("dagRunId", None)
        data = {}
        for model_name in model_list:
            try:
                model = globals()[model_name]
                queryset = model.objects.filter(dagRunId=dagRunId)
                serializer = model.objects.filter(dagRunId=dagRunId)
                serializer = model_name + 'ExportSerializer'
                serializer = globals()[serializer](queryset, many=True)
                data[model_name] = serializer.data
            except LookupError:
                pass
        json_data = json.dumps(data, indent=4,cls=DateTimeEncoder)
        response = HttpResponse(json_data, content_type='application/json')
        response['Content-Disposition'] = 'attachment; filename="export_%s.json"'%(datetime.now())
        return response

模型.py

class Products(BaseIdentifiableModel):
    name = models.CharField(max_length=255, default=None, null=True, blank=True)
    price = models.CharField(max_length=50, default=None, null=True, blank=True)
    cost = models.CharField(max_length=50, default=None, null=True, blank=True)
    manufacturer = models.CharField(max_length=100, default=None, null=True, blank=True)
    model = models.CharField(max_length=255, default=None, null=True, blank=True)
    material = models.CharField(max_length=255, default=None, null=True, blank=True)
    interior = models.CharField(max_length=255, default=None, null=True, blank=True)
    upc = models.CharField(max_length=100, default=None, null=True, blank=True)
    imageUrl = models.CharField(max_length=255, default=None, null=True, blank=True)
    isTaxed = models.BooleanField(null=True, default=None)
    stateTax = models.BooleanField(null=True, default=None)
    localTax = models.BooleanField(null=True, default=None)
    funeralHomeLocations = models.ForeignKey("death_spec.FuneralHomeLocations", models.DO_NOTHING, default=None, null=True, related_name="products_funeral_home_locations", blank=True)
    productCategory = models.ForeignKey("death_spec.ProductCategories", models.DO_NOTHING, default=None, null=True, related_name="products_product_category", blank=True)
    generalPriceList = models.ForeignKey("death_spec.GeneralPriceLists", models.DO_NOTHING, default=None, null=True, related_name="products_general_price", blank=True)

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'products'
class GeneralPriceLists(BaseIdentifiableModel):
    funeralHomeLocations = models.ForeignKey("death_spec.FuneralHomeLocations", models.DO_NOTHING, default=None, null=True, related_name="general_price_funeral_home_locations", blank=True)
    name = models.CharField(max_length=255, default=None, null=True, blank=True)
    chartOfAccounts = models.ForeignKey("death_spec.ChartOfAccounts", models.DO_NOTHING, default=None, null=True, related_name="general_price_chart_accounts", blank=True)
    products = models.ForeignKey("death_spec.Products", models.DO_NOTHING, default=None, null=True, related_name="general_price_products", blank=True)
    packages = models.ForeignKey("death_spec.Packages", models.DO_NOTHING, default=None, null=True, related_name="general_price_packages", blank=True)
    
    def __str__(self):
        return self.name
    class Meta:
        db_table = 'generalPriceLists'
class Packages(BaseIdentifiableModel):
    name = models.CharField(max_length=255, default=None, null=True, blank=True)
    description = models.TextField(default=None, null=True, blank=True)
    price = models.CharField(max_length=50, default=None, null=True, blank=True)
    funeralHomeLocations = models.ForeignKey("death_spec.FuneralHomeLocations", models.DO_NOTHING, default=None, null=True, related_name="packages_funeral_home_locations", blank=True)
    products = models.ForeignKey("death_spec.Products", models.DO_NOTHING, default=None, null=True, related_name="packages_products", blank=True)
    generalPriceList = models.ForeignKey("death_spec.GeneralPriceLists", models.DO_NOTHING, default=None, null=True, related_name="packages_general_price", blank=True)

    class Meta:
        db_table = 'packages'

序列化器.py

class ProductsExportSerializer(serializers.ModelSerializer):
    general_price_products = GeneralPriceListsSerializer()
    packages_products = PackagesSerializer()
    class Meta:
      model = Products

最終回應:

{
    "Products": [
        {
            "uuid": "1e19aa29-27a9-4262-9959-d72cb7a3b48f",
            "general_price_products": {
                "sourceId": null,
                "sourceSystem": null,
                "dagRunId": null,
                "name": null,
                "funeralHomeLocations": null,
                "chartOfAccounts": null,
                "products": null,
                "packages": null
            },
            "packages_products": {
                "sourceId": null,
                "sourceSystem": null,
                "dagRunId": null,
                "name": null,
                "description": null,
                "price": null,
                "funeralHomeLocations": null,
                "products": null,
                "generalPriceList": null
            },
            "sourceId": 2,
            "sourceSystem": "Dennard",
            "dagRunId": "dennard",
            "name": "Basic Services of Funeral Director & Staff",
            "price": "1775",
            "cost": "1775",
            "manufacturer": null,
            "model": null,
            "material": null,
            "interior": null,
            "upc": null,
            "imageUrl": "",
            "isTaxed": false,
            "stateTax": null,
            "localTax": null,
            "funeralHomeLocations": null,
            "productCategory": "c3031da6d65143eb8e6a7998e81f563b",
            "generalPriceList": "61413e77fdbd439f9097d00b83467620"
        },
      fields = "__all__"

我卡住了,我無法得到這種關系。 packages_productsgeneral_price_products變成 null 值,這是不應該的。 我錯過了什么?

我缺少的是我使用的是不正確的related_name值。 它應該是我們在模型中創建的變量。 所以舊版本的序列化器是

class ProductsExportSerializer(serializers.ModelSerializer):
    general_price_products = GeneralPriceListsSerializer()
    packages_products = PackagesSerializer()
    class Meta:
      model = Products

但它應該是這樣的:

class ProductsExportSerializer(serializers.ModelSerializer):
    generalPriceList = GeneralPriceListsSerializer()
    productCategory = PackagesSerializer()
    funeralHomeLocations = FuneralHomeLocationsSerializer()
    class Meta:
      model = Products
      fields = "__all__"

變量名稱來自我們在 model.py 中指定的model.py變量

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM