Модель при объединении двух таблиц через таблицу ассоциаций - PullRequest
0 голосов
/ 05 января 2020

Я создаю приложение, используя Python / Flask / SQLAlchemy / Marshmallow, где существует отношение M: M между «Пользователем» и «Сообществом». Это отношение моделируется с помощью таблицы ассоциации, поскольку мне нужно сохранить некоторые основные метаданные c.

Проблема, с которой я сталкиваюсь, заключается в том, что данные для объекта "Сообщество" не отображаются. Как это исправить?

Ниже мой код: Вот мой класс пользователя:

class User(db.Model):
    __tablename__ = "User"
    user_id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String)
    last_name = db.Column(db.String)
    email = db.Column(db.String)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)

Вот мой класс сообщества:

class Community(db.Model):
    __tablename__ = "Community"
    community_id = db.Column(db.Integer, primary_key=True)
    community_name = db.Column(db.String)
    community_description = db.Column(db.String)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)

А вот моя таблица ассоциации:

class UserCommunityAssociation(db.Model):
    __tablename__ = "UserCommunityAssociation"
    user_id = db.Column('user_id', db.Integer, db.ForeignKey('User.user_id'), primary_key=True)
    community_id = db.Column('community_id', db.Integer, db.ForeignKey('Community.community_id'), primary_key=True)
    db.Column(db.DateTime, default=datetime.utcnow)

    community = db.relationship("Community")
    user = db.relationship("User")

Я использую следующие две модели:

class UserSchema(ma.ModelSchema):
    class Meta:
        model = User
        sqla_session = db.session
    communitys = fields.Nested("CommunitySchema", many=True)

class CommunitySchema(ma.ModelSchema):
    class Meta:
        model = Community
        sqla_session = db.session

Позже в моем коде я выполняю запрос и пытаюсь получить вывод как таковой:

user = User.query \
        .join(UserCommunityAssociation)\
        .join(Community)    \
        .filter(User.user_id == UserCommunityAssociation.user_id) \
        .filter(User.user_id == user_id) \
        .first()

    if user is not None:
        user_schema = UserSchema()
        return user_schema.dump(user)

I хотел бы получить вывод, такой как:

[
  {
    "created_at": "string",
    "email": "string",
    "first_name": "string",
    "last_name": "string",
    "communities": [
      {
         "created_at": "string",
         "community_description": "string",
         "community_id": 0,
         "community_name"": "string",
         "updated_at": "string"
      }
    ],
    "updated_at": "string",
    "user_id": 0
  }
]
...