You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django模型关系困惑:ManytoOne、OneToMany与ManyToMany的使用场景

Django模型关系困惑:ManytoOne、OneToMany、ManyToMany适用场景与问题解决

我正在学习Django框架,对模型关系的使用存在困惑,无法明确ManytoOne、OneToMany和ManyToMany关系的适用场景,也难以梳理它们的逻辑。

场景1:多产品对应一个分类(已实现预期)

每个Product(产品)仅对应一个Category(分类),已实现“多产品对应一个分类,一个分类可含多产品”的逻辑,代码如下:

class Product(models.Model):
    name = models.CharField(max_length=255)
    description = models.TextField()
    price = models.DecimalField(decimal_places=3, max_digits=20)
    is_available = models.BooleanField()
    category = models.ForeignKey('Category', on_delete=models.PROTECT)

    def __str__(self) -> str:
        return f'Product: {self.name}'


class Category(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self) -> str:
        return f"Category: {self.name}"

场景2:一个产品对应多个分类,一个分类仅对应一个产品(未实现预期)

想要实现“一个产品可对应多个分类,一个分类仅对应一个产品”,但编写代码后仍能给同一分类添加多个产品,与预期不符,代码如下:

class Product(models.Model):
    name = models.CharField(max_length=255)
    description = models.TextField()
    price = models.DecimalField(decimal_places=3, max_digits=20)
    is_available = models.BooleanField()

    def __str__(self) -> str:
        return f'Product - {self.name}'


class Category(models.Model):
    name = models.CharField(max_length=255)
    product = models.ForeignKey(Product, on_delete=models.PROTECT)

    def __str__(self) -> str:
        return f"Category - {self.name}"

疑惑点

  • 是否该使用ManyToMany关系?虽认为这是最优方案,但听说其过于繁琐应尽量避免;
  • 或是添加unique_together约束?但我觉得这不是好办法;
  • 不理解为何上述OneToMany关系的代码无法限制分类对应的产品数量。

内容的提问来源于stack exchange,提问作者waterpy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:23:21