【问题标题】:Listing many-to-many field in django在 django 中列出多对多字段
【发布时间】:2015-08-23 14:51:37
【问题描述】:

我的模型-

class tags(models.Model):
        tag_id = models.AutoField(primary_key = True)
        tname = models.CharField(max_length = 30, unique = True)
        def __unicode__(self):
            return u'%s %s' % (str(self.tag_id), self.tname)
        class Meta:
            ordering = ('tag_id',)

class food(models.Model):
    food_id = models.AutoField(primary_key = True)
    fname = models.CharField(max_length = 150, unique = True)
    image = models.ImageField(default = 'index.png')
    tag = models.ManyToManyField('tags')
    def __unicode__(self):
        return u'%s %s (%s)' % (str(self.food_id), self.fname, ", ".join(t.tname for t in self.tag.all()))
    class Meta:
        ordering = ('food_id','fname')

class price_list(models.Model):
    price_id = models.AutoField(primary_key = True)
    rate = models.PositiveSmallIntegerField(default = 0)
    h = models.ForeignKey('hotels')
    f = models.ForeignKey('food')
    def __unicode__(self):
        return u'%s %s %s' % (str(self.price_id), self.h.hname, self.f.fname)

我想查询给定酒店所有食物的所有标签。

我试着这样做 -

data['menu'] = list(price_list.objects.filter(h__hotel_id = post['hotel_id']).values('f__fname','f__tag__tname'))

但这给了我这样的结果-

{"menu": [{"f__tag__tname": "Veg", "f__fname": "Paneer Butter Masala"}, {"f__tag__tname": "Indian", "f__fname": "Paneer Butter Masala"}, {"f__tag__tname": "Continental", "f__fname": "Paneer Butter Masala"}]}

我希望我的结果像-

{"menu": [{"f__tag__tname": ["Veg", "Indian", "Continental"], "f__fname": "Paneer Butter Masala"}]}

我也尝试了prefetch_related,但无法获得所需的输出。

感谢任何帮助。

提前致谢。

编辑:

我这样修改了我的查询-

data = {}
            data['menu'] = list(price_list.objects.filter(h__hotel_id = post['hotel_id']).values('f__fname'))
            i = 0
            for d in data['menu']:
                data['menu'][i]['tag_list'] = list(food.objects.filter(food_id = d['f__food_id']).values('tag__tname')) 
                i = i+1
            return JsonResponse(data)

它给了我输出-

{"menu": [{"f__fname": "Paneer Butter Masala", "tag_list": [{"tag__tname": "Veg"}, {"tag__tname": "Indian"}, {"tag__tname": "Continental"}]}]}

不是我想要的,但比以前的输出要好。但我认为我正在做的查询效率很低。

如何优化我的查询以及如何获得我想要的输出,即

{"menu": [{"f__tag__tname": ["Veg", "Indian", "Continental"], "f__fname": "Paneer Butter Masala"}]}

提前致谢。

【问题讨论】:

    标签: python django django-models django-orm


    【解决方案1】:

    尝试这样的事情(作为属性放在你的模型上):

    def get_tnames_fnames(self):
        return map(str, self.f.all().values('fname', 'tag__tname', flat=True))
    

    另外,我会将模型的第一个字母大写。例如,

    class Tags(models.Model):
        . . .
    
    class Food(models.Model):
        . . .
    
    class PriceList(models.Model):
        . . .
    

    【讨论】:

    • 感谢您的回答,但我无法使其正常工作。您能否编辑并告诉我我应该把get_tnames_fnames 放在哪里以及我应该在price_list 上做什么查询。顺便说一句,这只是为了测试,所以我模糊地命名了我的模型。完成所有查询后,我会立即纠正。
    猜你喜欢
    • 2021-04-05
    • 2021-11-21
    • 2013-04-27
    • 2014-06-28
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    相关资源
    最近更新 更多