1

youtube capturefiltre plusieurs objets et de nouveaux champs "retours dans sérialiseur

Tout comme Youtube, je veux voir quelles catégories mon post (tenue) est en.

Mon approche est ...

  1. obtenir la liste entière des catégories appartiennent à l'utilisateur
  2. obtenir la liste entière des catégories appartiennent à l'utilisateur et le poste
  3. les comparer et retour JSON

En construisant un Seriailizer, j'ai l'impression d'être totalement en stock. Alors frustraing ... :(

S'il vous plaît ne hésitez pas à changer mon approche si vous avez une meilleure idée.

outputis JSON qu'on se attend

{ 
    ... 
    "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' 
    }, 
    ] 
} 

Voici views.py

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

Voici serializers.py (ceci est un problème)

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. 
     ) 

Si vous avez besoin d'un modèle

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

ajouté toujours 'True'? –

+0

Je viens d'ajouter plus de descriptions sur la partie JSON. @BearBrown Merci d'avoir signalé –

+0

@BearBrown Faites-moi savoir si quelque chose n'est pas clair –

Répondre

1

si je comprends que vous corriger, vous pouvez essayer:

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 

Note dans la values vous avez besoin d'ajouter tous les champs dont vous avez besoin pour la CategorySerializer

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

Merci beaucoup pour votre aide et essayez! Je pense que vous avez compris le point mais votre code fourni ne semble pas fonctionner parce que je ne vois que {"name": "~~", "ajouté": true} sorties en série. Je m'attends à voir des catégories entières associées à l'utilisateur et à la publication. –

+0

Pourriez-vous en essayer un nouveau ..?Je ne comprends pas votre code mais je peux voir votre logique qui est très agréable –

+0

Maintenant la sortie est "catégories": [ { "id": 1, "nom": "Gym", "ajouté": vrai }, { "id": 2, "name": "l'école", "ajouté": true } ] –