【问题标题】:how to serialize a dictionnary using Composite fields如何使用复合字段序列化字典
【发布时间】:2021-01-13 11:16:32
【问题描述】:

我正在尝试开发 POST API。我正在尝试使用字典来存储演员模型社交链接的社交链接应该存储在演员模型中的变量社交中。

socials= {"facebook":"www.facebook.com/" , "instagram":"www.instagram.com/" ,"linkedin":"www.linkedin.com/" }

这是演员模型

模型.py

class Actor:
  name = models.CharField(max_length=250)
  slug = models.SlugField(max_length=250, unique=True)
  bio = models.TextField()
  created = models.DateTimeField(default=timezone.now )
  updated = models.DateTimeField(auto_now=True)

  socials = models.CharField(max_length=1024 , blank=True)

  class Meta:
    app_label = 'actors'
    verbose_name = _('Actor')
    verbose_name_plural = _('Actors')
    ordering = ('name',)   

  def __str__(self):
    return self.name

serializer.py

class ActorSerializer(serializers.ModelSerializer): 
    added_by = serializers.ReadOnlyField(source='added_by.username')
    socials = serializers.DictField(
        child=serializers.URLField(max_length=200, min_length=None, allow_blank=False)
    )
    class Meta:
        model = Actor
        fields = '__all__'

views.py

class ActorListView(generics.ListCreateAPIView):
    queryset = Actor.objects.all()
    serializer_class = ActorSerializer

这是我的代码。但是为了做我想做的事,缺少一些东西(我有一个错误)。 有人可以提出解决方案吗?

【问题讨论】:

    标签: django django-models django-rest-framework django-views django-serializer


    【解决方案1】:

    很难说没有看到你的错误,但如果你试图通过你的 API 返回字典,那么我会使用models.JSONField

    class Actor(models.Model):
      name = models.CharField(max_length=250)
      slug = models.SlugField(max_length=250, unique=True)
      bio = models.TextField()
      created = models.DateTimeField(default=timezone.now )
      updated = models.DateTimeField(auto_now=True)
    
      socials = models.JSONField(null=True)  # You choose if you want to allow null values
    

    然后在你的序列化器中

    class ActorSerializer(serializers.ModelSerializer): 
        added_by = serializers.ReadOnlyField(source='added_by.username')
    
        class Meta:
            model = Actor
            fields = '__all__'
    

    您不需要覆盖序列化程序中的socials 字段,因为它将自动序列化。我不确定你在用 added_by 做什么,所以我无法对此发表评论。

    您现在可以使用 JSON 从字典中加载和转储。

    import json
    
    my_dict = {"a": "a"}
    json_copy_of_my_dict = json.loads(a)
    a_new_dict_from_json = json.dumps(json_copy_of_my_dict)
    

    【讨论】:

    • 实际上错误是 "AttributeError: 'str' object has no attribute 'items'" 。但是我没有在模型中使用 JsonField,因为我使用的是 3.0.11 的 Django 版本,并且它仅受 3.1 版本的支持。
    • 你可以使用 django JSONField 支持来自:from django.contrib.postgres.fields import JSONField
    • 谢谢:我升级了 django 版本,它工作正常。
    【解决方案2】:

    导入 Jsonfield 并尝试使用 jsonfield 而不是 CharField 但我认为 CharField 也应该可以工作。最好告诉你所面临的错误

    【讨论】:

    • 错误是“AttributeError: 'str' object has no attribute 'items'”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多