【问题标题】:How to get value of ManyToMany field rather than their ids?如何获取 ManyToMany 字段的值而不是它们的 id?
【发布时间】:2022-11-10 15:46:20
【问题描述】:

我有三个模型,如下图:

class TagsModel(models.Model):
    title = models.CharField(max_length=200)

    def __str__(self):
        return self.title
 
class ImagesModel(models.Model):
    title = models.CharField(max_length=500, default='image')
    image_cdn = models.TextField(null=True, blank=True)
    image = models.ImageField(upload_to='articles/images/', null=True, blank=True)
    timestamp = models.DateTimeField(auto_now=True)
    update = models.DateTimeField(auto_now_add=True)
    def __str__(self):
        return self.title


class ArticlesModel(models.Model):
    title = models.CharField(max_length=1000)
    category = models.CharField(max_length=40, choices=category_choices, default=('General', 'General'))
    summary = models.TextField(blank=False, null=True, max_length=5000)
    tags = models.ManyToManyField(TagsModel, blank=True)
    image = models.ImageField(blank=True, null=True, upload_to='articles/article-image/')
    image_cdn = models.TextField(blank=True, null=True)
    image_src = models.ForeignKey(ImagesModel, related_name='Image_cdn',  on_delete=models.PROTECT, null=True)
    images = models.ManyToManyField(ImagesModel, blank=True) 
    json = models.JSONField(null=True, blank=True)
    html = models.TextField(blank=True, null=True)
    is_published = models.BooleanField(default=False)
    update = models.DateTimeField(auto_now_add=True)
    timestamp = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('articles:article_detail', kwargs={'article_id': self.id})


而在 view.py

class ArticlesView(APIView):

    def get(self, request):
        articles_list = ArticlesModel.objects.all()
        images_list = ImagesModel.objects.all()
        images_serializer = ImagesSerializer(images_list, many=True)
        articles_serializer = ArticlesListSerializer(articles_list, many=True)
        return Response({
            'images':images_serializer.data,
            'articles':articles_serializer.data
        })


因此,当我发送请求时,我会得到如下结果:

这里的问题是我得到了图像和标签的 id,而不是对象本身! 我问在 django/DRF 中是否有办法获取文章查询中包含的对象(图像、标签),而不仅仅是它们的 id?

【问题讨论】:

    标签: python django django-models django-rest-framework


    【解决方案1】:

    解决方案

    class ProductSerializer(serializers.ModelSerializer):
        cate = serializers.SerializerMethodField('get_cate')
    
        def get_cate(self,obj):
            return [cate.name for cate in obj.cate.all()]
            
        class Meta:
            model = ProductModel 
            fields = "__all__"
    

    响应输出

    [
        {
            "id": 1,
            "cate": [
                "Category5",
                "Category6"
            ],
            "name": "Apple",
            "price": "12.00",
            "released_at": "2022-10-18T13:16:01Z"
        },
        {
            "id": 2,
            "cate": [
                "Category1",
                "Category2",
                "Category3"
            ],
            "name": "Kiwi",
            "price": "20.00",
            "released_at": "2022-10-18T13:16:01Z"
        },
        {
            "id": 3,
            "cate": [
                "Category2",
                "Category4",
                "Category5",
                "Category6"
            ],
            "name": "Tomato",
            "price": "25.00",
            "released_at": "2022-10-18T13:16:01Z"
        }
    ]
    

    【讨论】:

    • 第二种方法不行!第一种方法给了我一个像'Tags.objects.None'这样的字符串,但我阅读了文档,我必须设置 many=True 它给了我什么字符串在模型中返回 ``` def __str__(self): return self.title ```
    • 我一直在阅读文档,并找到了这个解决方案:django-rest-framework.org/api-guide/relations/…。无论如何,我会接受你的回答,因为它给了我一个提示,我应该从哪里开始寻找!谢谢。
    • 请检查更新的新解决方案
    • 在回答中,我添加了标签不包括图像的场景
    【解决方案2】:

    这称为序列化程序关系,您可以在本文中找到解决问题的方法和更多建议https://www.django-rest-framework.org/api-guide/relations/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 2021-12-29
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      相关资源
      最近更新 更多