M2M关系还是2 FK?

以下哪种结构更可取:

# M2M
class UserProfile(models.Model):
    ...
    groups = models.ManyToManyField(Group)

class Group(models.Model):
    ...

要么 -

# 2 FKs
class UserProfile(models.Model):
    ...

class Group(models.Models):
    ...

class GroupMember(models.Model):
    user = models.ForeignKey(UserProfile)
    group = models.ForeignKey(Group)

哪个更好?

0
额外 编辑
意见: 1

2 答案

两者基本相同。当您执行M2M时,Django会自动创建一个中介模型,它非常类似于您的 GroupMember 模型。但是,它还设置了一些API挂钩,允许您直接从模型访问 Group 模型,而不必混淆中间模型。

您可以像@ San4ez解释的那样通过使用 through 来添加相同的钩子,但您只会使事情更加复杂。通过模型创建自定义仅在您需要为关系添加其他字段时才有用。否则,坚持默认。

总而言之,#1更好,只是因为它与#2完全一样,但更简单,没有无关的代码。

1
额外

您还可以使用结合这两个变体通过选项

groups = models.ManyToManyField(Group, through='GroupMember')

你认为 better 是什么意思?通常,您不需要创建中间模型(除非需要存储额外数据)。

ManyToManyField does his job perfectly, so don't write its functionality by yourself.

1
额外