1

youtube capture過濾多個對象和串行

就像回報的Youtube「新領域」,我想看看哪些類別我的文章(裝)在

我的方法是...

  1. 獲取類別的整個列表屬於用戶
  2. 獲取類別的整個列表屬於用戶和後
  3. 對它們進行比較,並返回JSON

建立一個Seriailizer時,我覺得我完全是股票。所以frustraing ... :(

請隨時免費,如果您有任何更好的想法來改變我的做法。

預期JSON outputis下面

{ 
    ... 
    "categories": [ 
    { 
     "id": 1, 
     "name": "asd" 
     "added": True <- since the post is added to 'asd' 
    }, 
    { 
     "id": 2, 
     "name": "workout" 
     "added": True 
    }, 
    ... 
    { 
     "id": 5, 
     "name": "bgm" 
     "added": False <- since the post is not added to 'bgm' 
    }, 
    ] 
} 

這裏是views.py

class OutfitDetailView(generics.RetrieveAPIView): 
    queryset = Outfit.objects.all() 
    serializer_class = OutfitDetailSerializer 
    lookup_field = 'pk' 

這裏是serializers.py(這是一個問題)

class OutfitDetailSerializer(serializers.ModelSerializer): 
    ... 
    def get_categories(self, obj): 
      # Right Here! Get whole categories associated with user 
      all_categories = Category.objects.filter(owner=self.context['request'].user) 
      # And the categories associated with user AND the post 
      categories = obj.categories.filter(owner=self.context['request'].user) 

      return CategorySerializer(categories, many=True).data 

class CategorySerializer(serializers.ModelSerializer):  
    class Meta: 
     model = Category 
     fields = (
      'id', 
      'name', 
      'added' <- here I want to add 'added' field but I don't know how. 
     ) 

如果你需要一個模型

class Outfit(models.Model): 
    ... 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True) 
    content = models.CharField(max_length=30) 
    ... 

class Category(models.Model): 
    name = models.CharField(max_length=20) 
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True) 
    outfits = models.ManyToManyField(Outfit, related_name="categories", blank=True) 
    main_img = models.ImageField(
          upload_to=upload_location_category, 
          null=True, 
          blank=True) 
    ... 
+0

總是加上'True'? –

+0

我剛剛在JSON部分添加了更多描述。 @BearBrown感謝您指出 –

+0

@BearBrown讓我知道如果有什麼不清楚 –

回答

1

如果我理解你正確,你可以嘗試:你需要添加你需要的CategorySerializer

各領域的 values

class OutfitDetailSerializer(serializers.ModelSerializer): 

    def get_categories(self, obj): 
     user = self.context['request'].user 
     categories = Category.objects.filter(owner=user) 
     added = categories.extra(select={'added': '1'}).filter(outfits__pk=obj.pk) 
     added = list(added.values('added', 'name', 'id')) 
     added_f = categories.extra(select={'added': '0'}).exclude(outfits__pk=obj.pk) 
     added_f = list(added_f.values('added', 'name', 'id')) 
     categories = added + added_f 
     return CategorySerializer(categories, many=True).data 

class CategorySerializer(serializers.ModelSerializer): 
    added = serializers.BooleanField() 
    class Meta: 
     model = Category 
     fields = (
      'id', 
      'name', 
      'added' 
     ) 
+0

非常感謝你的幫助和嘗試!我認爲你已經明白了,但是你提供的代碼看起來不起作用,因爲我只看到{「name」:「~~」,「added」:true}系列輸出。我希望看到與用戶和帖子相關的整個類別。 –

+0

你可以再試一次..?我不明白你的代碼,但我可以看到你的邏輯很好 –

+0

現在輸出是「類別」:[ { 「id」:1, 「name」:「Gym」, 「added」真正 }, { 「ID」:2, 「名」: 「學校」, 「補」:真 } ] –