首页 > 解决方案 > 无法确定关系 Product.collections 上的父/子表之间的连接条件

问题描述

Product 和 Collection 之间的关系是多对多的。一个产品可以在多个集合中,每个集合可以有多个产品。对于这种情况,我想将 django 模型转换为 fastapi 中的 sqlalchemy。下面是 django 模型中的产品和集合表

class Product(models.Model):
    product_type = models.ForeignKey(
        ProductType, related_name="products", on_delete=models.CASCADE
    )
    name = models.CharField(max_length=250)
    slug = models.SlugField(max_length=255, unique=True, allow_unicode=True)


class CollectionProduct(models.Model):
    collection = models.ForeignKey(
        "Collection", related_name="collectionproduct", on_delete=models.CASCADE
    )
    product = models.ForeignKey(
        Product, related_name="collectionproduct", on_delete=models.CASCADE
    )

class Collection(models.Model):
    name = models.CharField(max_length=250, unique=True)
    slug = models.SlugField(max_length=255, unique=True, allow_unicode=True)
    products = models.ManyToManyField(
        Product,
        blank=True,
        related_name="collections",
        through=CollectionProduct,
        through_fields=("collection", "product"),
    )
    background_image = VersatileImageField(
        upload_to="collection-backgrounds", blank=True, null=True
    )

我尝试了以下方法将 django 模型迁移到 sqlalchemy。但是,我收到以下错误

sqlalchemy.exc.NoForeignKeysError:无法确定关系 Product.collections 上的父/子表之间的连接条件 - 没有链接这些表的外键。确保引用列与 ForeignKey 或 ForeignKeyConstraint 相关联,或指定“primaryjoin”表达式。

sqlalchemy

class Product(Base, TimestampMixin):
    id = Column(Integer, primary_key=True, index=True)
    title = Column(String(255), nullable=False)
    slug = Column(String, index=True, unique=True)
    # referencing the parent
    product_type_id = Column(Integer, ForeignKey("producttype.id"))
    product_type = relationship("ProductType", back_populates="products")

    collections = relationship(
        "Collection",
        back_populates="product",
    )
    collectionproduct = relationship("CollectionProduct", back_populates="product")



class Collection(Base, TimestampMixin):
    id = Column(Integer, primary_key=True, index=True)
    title = Column(String(255), nullable=False)
    slug = Column(String, index=True, unique=True)
    product = relationship(
        "Product",
        # secondary=ProductCollection.__tablename__,
        back_populates="collections",
    )
    collectionproduct = relationship("CollectionProduct", back_populates="collection")


class CollectionProduct(Base, TimestampMixin):
    id = Column(Integer, primary_key=True, index=True)
    collection_id = Column(Integer, ForeignKey("collection.id"))
    product_id = Column(Integer, ForeignKey("product.id"))

    collection = relationship("Collection", back_populates="collectionproduct")
    product = relationship("Product", back_populates="collectionproduct")

如何通过克服加入问题来迁移 sqlalchemy 中产品和集合的 django 模型?

标签: pythondjangosqlalchemyfastapi

解决方案


推荐阅读