2017-03-28 6 views
0

私の悪い英語のために申し訳ありませんが、私は何を意味するのか理解できます。django rest frameworkでidの代わりに外部キーの値を取得するには

OUTはNOW GETTING IMをPUT:

[ 
    { 
     "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" 
    } 
] 

は、私が欲しいもの:
は私がTABLE INSTEAD OF IDにある外部キー'S(MainCatName)値を返すことにしたいです。ここ

[ 
    { 
     "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" 
    } 
] 

LIKE私models.py

で[区分名= models.CharField(MAX_LENGTH = 50)]、すなわち値は私のコードである:

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): 
    MainCatName = serializers.SlugRelatedField(read_only=True, slug_field='CategoryName') 
    class Meta: 
     model = Products 
     fields = ('MainCatName', 'Name', 'Image') 

編集:

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

答えて

1

あなたはそのためのSlugRelatedFieldがあります。 データベース関係にまたがるので、Products.objects.only('MainCatName','Name','Image')と一緒に動作するかどうかはわかりません。また、select_relatedを使用してN + 1のDBクエリを取得しないようにしたい場合もあります。

+0

すべての魅力に感謝 – drdree

0

一般的なDjangoの方法は、この場合Categoryには、お使いのモデルにnatural keysを定義することです:

自然キーでシリアライズ
  1. :あなたは、カテゴリのCategoryNameを返しているあなたのCategoryクラスにnatural_key(self)メソッドを追加します。ユニークでなければなりません!自然キーによる

    def natural_key(self): 
        return self.CategoryName 
    
  2. デシリアライズ:あなたはあなたのCategoryモデルのデフォルトのマネージャーを定義したい:

    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) 
    
関連する問題