落后多对多Django查询

时间:2013-04-17 16:20:51

标签: python django django-rest-framework

class tags(models.Model):
    """ This is the tag model """
    tag = models.CharField(max_length=15)               # Tag name
    tagDescription = models.TextField()                 # Tag Description
    tagSlug = models.CharField(max_length=400)          # Extra info can be added to the existing tag using this field
    createdAt = models.DateTimeField(auto_now_add=True) # Time at which tag is created
    updatedAt = models.DateTimeField(auto_now=True)     # Time at which tag is updated

class stores(models.Model):
    """ This is the store model """
    storeName = models.CharField(max_length=15)                                          # Store Name
    storeDescription = models.TextField()                                                # Store Description
    storeURL = models.URLField()                                                         # Store URL
    storePopularityNumber = models.IntegerField(choices=PRIORITY_CHOICES,default=2)                # Store Popularity Number  
    storeImage = models.ImageField(upload_to="images")                                   # Store Image 
    storeSlug = models.CharField(max_length=400)                                         # This is the text you see in the URL
    createdAt = models.DateTimeField(auto_now_add=True)                                  # Time at which store is created
    updatedAt = models.DateTimeField(auto_now=True)                                      # Time at which store is updated
    storeTags = models.ManyToManyField(tags)                                             # All the tags associated with the store

我想找出与特定标签相关的所有商店。 for t in tags.objects.all(): print ([str(a.storeName) for a in t.stores_set.all()]) 通过使用上面的循环我能够得到所有商店的所有标签......但实际上我正在使用Django rest-frameWork ...现在我有一个视图,它使用序列化器返回相关商店的名称到商店...

class tagList(generics.ListAPIView,APIView):

    serializer_class = getAllTagsDetailSerializer

    def get_queryset(self):
        key = self.request.QUERY_PARAMS.get('appKey', None)
        getTagName = self.request.QUERY_PARAMS.get('tagName', None)
        keyData = app.objects.filter(appKey=key).exists()    
        try:
            if keyData == True:

                return tags.objects.filter(tag=getTagName)
            else:
                raise exceptions.PermissionDenied
        except app.DoesNotExist:
            pass

`class getAllStoresDetailSerializer(serializers.ModelSerializer):
    storeImage = serializers.Field(source='imageURL')
    storeTags =serializers.Field(source='StoreTags')

    class Meta:
        model = stores
        fields = ('storeName','storeDescription','storeURL',
                    'storePopularityNumber','storeImage','storeTags',
                    'storeSlug','createdAt','updatedAt'
                 )`


class getAllTagsDetailSerializer(serializers.ModelSerializer):
    tagStores = RelatedField(Many=True)
    class Meta:
        model = tags
        fields = ('tagStores'                   
                    )

但这不起作用......任何人都可以帮助我......

3 个答案:

答案 0 :(得分:0)

这很简单,带有你的标签:

tag.store_set.all()

答案 1 :(得分:0)

t = Tag.objects.get(pk=1)
stores = t.stores_set.all()

答案 2 :(得分:0)

我找到了解决方案......

这是处理get请求的类......

class tagList(generics.ListAPIView,APIView):
    model = tags
    serializer_class = getAllTagsDetailSerializer

    def get_queryset(self):
        key = self.request.QUERY_PARAMS.get('appKey', None)
        getTagName = self.request.QUERY_PARAMS.get('tagName', None)
        keyData = app.objects.filter(appKey=key).exists()    
        try:
            if keyData == True:
                return tags.objects.filter(tag=getTagName)
            else:
                raise exceptions.PermissionDenied
        except app.DoesNotExist:
            pass

此Serializer类:

class getAllTagsDetailSerializer(serializers.ModelSerializer):
    tagStores = serializers.Field(source='getAllStoreNames')

    class Meta:
        model = tags
        fields = ('tagStores')

这是我的标签型号:

class tags(models.Model):
    """ This is the tag model """
    tag = models.CharField(max_length=15)               # Tag name
    tagDescription = models.TextField()                 # Tag Description
    tagSlug = models.CharField(max_length=400)          # Extra info can be added to the existing tag using this field
    createdAt = models.DateTimeField(auto_now_add=True) # Time at which tag is created
    updatedAt = models.DateTimeField(auto_now=True)     # Time at which tag is updated

    def __unicode__(self):
        """Method to display string correctly"""
        return unicode(self.tag)

    def getAllStoreNames(self):

        for t in tags.objects.filter(tag=self.tag):      
            return  ([str(a.storeName) for a in t.stores_set.all()])

    class Meta:
        """Meta class to control display Behavior of the Model name """
        verbose_name_plural = "Tags"

如果有人想知道的话,让我解释一下...... 在我的类tagList中设置一个由return tags.objects.filter(tag=getTagName)设置的查询。这将根据指定的tagName过滤掉所有商店的名称...然后它进入序列化器类,我在其中设置tagStores = serializers.Field(source='getAllStoreNames')然后它读取字段值并调用标签模型中的getAllStoreNames,该模型返回与商店相关的标签的名称...如果有人知道更有效的解决方案,请分享...