【问题标题】:How can i Get foreign key's value instead of id , in django rest framework如何在 django rest 框架中获取外键的值而不是 id
【发布时间】:2017-03-28 14:31:19
【问题描述】:

抱歉我的英语不好希望你能明白我的意思。

现在就发布吧:

[
    {
        "MainCatName": 1,
        "Name": "harry potter",
        "Image": "/media/101029496--sites-default-files-images-101029496-3176173-1748009911-hp.jp-1_MoxqrLp.jpg"
    },
    {
        "MainCatName": 2,
        "Name": "Princes Girl",
        "Image": "/media/character_princess_rapunzel_8320d57a.jpeg"
    },
    {
        "MainCatName": 3,
        "Name": "sex in the city",
        "Image": "/media/250px-SATC_Title.jpg"
    },
    {
        "MainCatName": 4,
        "Name": "who is dragon",
        "Image": "/media/Reggio_calabria_museo_nazionale_mosaico_da_kaulon.jpg"
    },
    {
        "MainCatName": 2,
        "Name": "drama queen",
        "Image": "/media/15241421_170761763390015_7913498865987146084_n.jpg"
    }
]

我想要什么:
我想返回表中的外键(MainCatName)值而不是 ID。即我的models.py中[CategoryName = models.CharField(max_length=50)]中的值

喜欢

[
    {
        "MainCatName": Story Books,
        "Name": "harry potter",
        "Image": "/media/101029496--sites-default-files-images-101029496-3176173-1748009911-hp.jp-1_MoxqrLp.jpg"
    },
    {
        "MainCatName": Darama,
        "Name": "Princes Girl",
        "Image": "/media/character_princess_rapunzel_8320d57a.jpeg"
    },
    {
        "MainCatName": Roamance,
        "Name": "sex in the city",
        "Image": "/media/250px-SATC_Title.jpg"
    },
    {
        "MainCatName": sex,
        "Name": "who is dragon",
        "Image": "/media/Reggio_calabria_museo_nazionale_mosaico_da_kaulon.jpg"
    },
    {
        "MainCatName": darama,
        "Name": "drama queen",
        "Image": "/media/15241421_170761763390015_7913498865987146084_n.jpg"
    }
]

这是我的代码:

veiws.py:

class GETCATVeiw(APIView):
    def get(self, request):
        data = Products.objects.only('MainCatName','Name','Image')
        serializer = GETCAT(data, many=True)
        return Response(serializer.data)

    def post(self):
        pass

models.py:

class Category(models.Model):
    CategoryName = models.CharField(max_length=50)
    class Meta:
            verbose_name_plural = 'Categories'

        def __str__(self):
        return self.CategoryName

class Products(models.Model):
    MainCatName = models.ForeignKey(Category, on_delete=models.CASCADE)
    Name = models.CharField(max_length=50)
    Image = models.ImageField()
    Price = models.IntegerField()
    DiscriptionHeading = models.CharField(max_length=100)
    DiscriptionParagraph = models.TextField(max_length=1000)

    class Meta:
            verbose_name_plural = 'Products'

        def __str__(self):
            return str(self.MainCatName)+' - '+self.Name+' - '+str(self.Price)+' $'

serializers.py:

class GETCAT(serializers.ModelSerializer):
    class Meta:
        model = Products
        fields = ('MainCatName', 'Name', 'Image')

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    你有SlugRelatedField

    class GETCAT(serializers.ModelSerializer):
        MainCatName = serializers.SlugRelatedField(read_only=True, slug_field='CategoryName')
        class Meta:
            model = Products
            fields = ('MainCatName', 'Name', 'Image')
    

    编辑: 我不确定它是否适用于Products.objects.only('MainCatName','Name','Image'),因为您将跨越数据库关系。此外,您可能希望使用select_related 来避免获得 N+1 DB 查询。

    【讨论】:

      【解决方案2】:

      通用的 Django 方法是在你的模型上定义natural keys,在本例中为Category

      1. 按自然键序列化:将natural_key(self) 方法添加到您的Category 类,在该类中返回类别的CategoryName。它必须是独一无二的!

        def natural_key(self):
            return self.CategoryName
        
      2. 通过自然键反序列化:您想为您的类别模型定义一个默认管理器:

        objects = CategoryManager()
        

        并在您的CategoryManager(models.Manager) 类中定义get_by_natural_key(self, name) 方法,该方法返回类别:

        class CategoryManager(models.Manager):
        
            def get_by_natural_key(self, name):
                return self.get(CategoryName=name)
        

      【讨论】:

        猜你喜欢
        • 2023-03-20
        • 2019-02-28
        • 1970-01-01
        • 1970-01-01
        • 2017-08-19
        • 1970-01-01
        • 2018-10-09
        • 2021-03-05
        • 2015-12-07
        相关资源
        最近更新 更多