M2M关系还是2 FK?

时间:2012-05-25 06:12:03

标签: mysql sql django

以下哪种结构更可取:

# 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)

哪个更好?

2 个答案:

答案 0 :(得分:1)

您还可以使用through选项

组合这两种变体
groups = models.ManyToManyField(Group, through='GroupMember')

better你是什么意思?通常您不需要创建中间模型(除非您必须存储extra data)。

ManyToManyField完美地完成了他的工作,所以不要自己编写它的功能。

答案 1 :(得分:1)

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

@ San4ez解释说,你可以使用through添加相同的钩子,但你只是让事情变得更复杂。只有在需要向关系中添加其他字段时,才能创建自定义through模型。否则,坚持使用默认值。

长而短,#1更好,只是因为它与#2完全相同,但更简单,没有多余的代码。