[英]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_products和general_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.