【问题标题】:How to generate json data from a many to many database table?如何从多对多数据库表生成json数据?
【发布时间】:2017-04-30 05:35:51
【问题描述】:

我使用 sqlite db 和 peewee 作为 ORM。

我的数据模型是:

class User(UserMixin, db.Model):
    nickname = CharField(index=True, unique=True)

class Circle(db.Model):
    name = CharField(unique=True)

class UserInCircle(db.Model):
    user = ForeignKeyField(User, related_name="in_circles")
    circle = ForeignKeyField(Circle, related_name="include_users")
    privilege = IntegerField()

我需要的是获得如下数据格式:

[{"nickname": "urbainy", "privilege": 7, "in_circles": [{"circle_name": "world"}, {"circle_name": "test"}]}, {"nickname": "ywe", "privilege": 1, "in_circles": [{"circle_name": "family"}], {"nickname": "ymo", "privilege": null, "in_circles": []}]

所以这是一个嵌套的 json 对象。我尝试了棉花糖,但由于多对多的数据结构而失败了。我一直无法获得in_circles 字段。我是程序员的初学者,所以这个问题可能是低级的。但我真的没有想法解决它。非常感谢!

【问题讨论】:

  • 你要使用ORM方式吗?不是 sql 查询?
  • @DanilaGanchar,是的,我更喜欢 ORM 方式。我不熟悉 sql-query。谢谢!

标签: python json peewee


【解决方案1】:

现在,我采用这种方式来解决问题:

@login_required
def setting():
    users_in_circles = (User.select(User.nickname,
                                    UserInCircle.privilege,
                                    Circle.name.alias("circle_name"))
                            .join(UserInCircle, JOIN.LEFT_OUTER)
                            .join(Circle, JOIN.LEFT_OUTER)
                            .order_by(User.id))
    users_in_circles_data = []
    user_nickname = ""
    user_in_circles = []
    for user_in_circle in users_in_circles.naive():
        if user_in_circle.nickname != user_nickname:
            user_nickname = user_in_circle.nickname
            user_in_circles = [dict(circle_name=str(user_in_circle.circle_name), privilege=str(user_in_circle.privilege))]
            users_in_circles_data.append(dict(nickname=user_in_circle.nickname, in_circles=user_in_circles))
        else:
            user_in_circles.append(dict(circle_name=str(user_in_circle.circle_name), privilege=str(user_in_circle.privilege)))
            users_in_circles_data[-1].update(nickname=user_in_circle.nickname, in_circles=user_in_circles)
    print(users_in_circles_data)
    return render_template("admin_setting.html", circles=Circle.select(), users=User.select(), users_in_circles_data=users_in_circles_data)

不知何故,我认为也许还有其他一些巧妙的方法可以实现这一点,例如棉花糖或其他一些工具。如果您知道更好的解决方案,欢迎回复我的帖子。

【讨论】:

  • 我认为 sql 方式更好:)))。行数过多,操作不便。
猜你喜欢
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 2021-05-25
相关资源
最近更新 更多