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'
)
但这不起作用......任何人都可以帮助我......
答案 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
,该模型返回与商店相关的标签的名称...如果有人知道更有效的解决方案,请分享...