首页Django正文

在前端实现类似后端models.objects.filter(id=xxx)

提问已结 2 56
水谦
水谦Django Double会员2018年7月12日 21:40
python django白

概述:做了一个三级关系模型,避免数据过度冗余,在最后得关系采用了manytomany 。假设游戏ABC,下面对应模块有abcde等,A有(abcd模块)B有(bce模块),假设a模块下有a1,a2,a3,a4...等数据,同理bcde。 table1:games(id--name) : 1-A,2-B,3-C ... table2: mokua(id--game_id--name)i:1-1-a, 2-1-b, 3-1-c, 4-1-d, 5-2-b, 6-2-c, 7-2-e table3: testdata(id--testdata) : 1-000, 2-001,3-002, 4-003, 5-004,6-005 .... 由于manytomany会额外产生一个表models_mokuai_testdata(id--testdata_id--mokuai_id):1-1-1, 2-1-2等

class game(models.Model):
    name = models.CharField(max_length=100, verbose_name=u'游戏名称')

class mokuai(models.Model):
    games = models.ForeignKey(game)
    name = models.CharField(max_length=100, verbose_name=u'模功能块')

class testdata(models.Model):
    mokuais = models.ManyToManyField(mokuai)
    name = models.CharField(max_length=300, verbose_name=u'测试内容')

    def get_mokuais(self):
        return ",".join([unicode(base) for base in self.mokuais.all()])

现假设game取A 得情况下,在前端显示出所有A得信息,游戏A--模块a--000 001 模块b- xxx ,xxx

view 里返回了 games.objects.all(), mokuai.objects.all(), testdata.objects.all()

{% for game in games %}
    {% for mokuai in mokuais %}
        {% testdata = testdata.objects.filter(mokuai.id) %}
        # 这里因为每个模块得id在循环里是变化得,所以要在manytomany得表里查找,
        #上面的写法是想法
        {% for foo in testdata %}
            {{ foo.name }}
        {% endfor %}
    {% endfor %}
{% endfor %}
回帖
  • the5fire
    2018年7月12日 22:59

    {[围观]}

    不要在模板做这个事,你觉得很别扭,那一定是代码组织上有问题。

    想办法在view层组织好数据,传递到模板中。

    另外对于Related关系的数据,要注意N+1的问题。


  • 水谦
    水谦(楼主)
    2018年7月22日 11:21

    最后还是重新规划了数据表得设计,跳过了manytomany得坑,采用得三级表得结构