提问人:Ivan 提问时间:11/4/2023 最后编辑:Cem PolatIvan 更新时间:11/7/2023 访问量:25
如何将自定义注释字段转储到 JSON 夹具 (Django)
How to dump custom annotated fields to JSON fixture (Django)
问:
我想在夹具中将令牌字段更改为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)
答:
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
评论