如何将自定义注释字段转储到 JSON 夹具 (Django)

How to dump custom annotated fields to JSON fixture (Django)

提问人:Ivan 提问时间:11/4/2023 最后编辑:Cem PolatIvan 更新时间:11/7/2023 访问量:25

问:

我想在夹具中将令牌字段更改为facebook_token。如果你能帮助我😁,我会很高兴

models.py

class FacebookAdAccounts(models.Model):
    id_ad = models.CharField(max_length=255)
    name_ad = models.CharField(max_length=255)
    currency = models.CharField(max_length=255, default='USD')
    is_active = models.BooleanField(default=True)
    business_account = models.ForeignKey(FacebookBusinessAccounts, on_delete=models.CASCADE, blank=True, null=True)
    token = models.CharField(max_length=510, blank=True, null=True)

    def __str__(self):
        return f'{self.id_ad} {self.name_ad} - {self.name_ad}'


class FacebookTokens(models.Model):
    token = models.CharField(max_length=510)
    user_id = models.CharField(max_length=255)

鉴于此模型,我想将 FacebookAdAccounts 模型的固定装置转换为 JSON 格式。

我有这个结果:

[
{
"model": "facebook.FacebookAdAccount",
"pk": 1,
"fields": {
"id_ad": "id_ad1",
"name_ad": "name_ad_1",
"currency": "USD",
"is_active": true,
"business_account": null,
"token": "TOKEN_USER#1"
},
...
]

我期待这个结果:


[
{
"model": "facebook.FacebookAdAccount",
"pk": 1,
"fields": {
"id_ad": "id_ad1",
"name_ad": "name_ad_1",
"currency": "USD",
"is_active": true,
"business_account": null,
"facebook_token": 4
},
...
]

我试过这个:

FacebookAdAccounts._meta.model_name = "FacebookAdAccount" FacebookAdAccounts._meta.app_label = "facebook"

subquery = FacebookTokens.objects.filter(token=OuterRef("token")).values("pk")[:1] 

**queryset = FacebookAdAccounts.objects.annotate( facebook_token=Subquery(subquery) )  # I want facebook_token field to also be serialized**

json_data = serializers.serialize("json", queryset, indent=4)

file_path = "data2.json"

with open(file_path, "w") as file: file.write(data)
JSON Django 序列化 夹具

评论


答:

0赞 Ivan 11/4/2023 #1

也许它会帮助某人。

我使用了这个(继承自 django.core.serializers.json.Serializer 并重写 get_dump_object() 方法):

from django.core.serializers.json import Serializer as JSONSerializer

class CustomSerializer(JSONSerializer):
    def get_dump_object(self, obj):
        data = super().get_dump_object(obj)
        data["fields"]["facebook_token"] = obj.facebook_token
        data["fields"].pop("token")
        return data