对django(ManytoMany)也就是m2m什么时候使用的一个困惑及解答

问题描述
class ProjectUser(models.Model):
    """ 项目参与者 """
    user = models.ForeignKey(verbose_name='参与者', to='UserInfo')#项目参与者可以是多个用户
    project = models.ForeignKey(verbose_name='项目', to='Project')#一个参与者会参加多个项目
    star = models.BooleanField(verbose_name='星标', default=False)
    create_datetime = models.DateTimeField(verbose_name='加入时间', auto_now_add=True)

  • 这里的用户表与项目明显是多对多的关系,按道理我们可以使用django model的m2m来解决,为什么在这里多手动定义了这张表?
答疑
  • 如果第三张表只需要用户和项目的id,那么我们就只需要在任意一张表使用m2m即可让django自动帮我们创建一张表。下图就是那我们在项目表里面的实例:


    image.png
  • 但是如果除了项目和用户id,还有其它的字段,那么就要自己手动创建第三张表。
through关键字
  • 让自己手动创建的和自动创建的进行匹配共存。


    image.png

我们可以加上m2m,但是在django自动生成的时候我们就给他手动指定一张已有的表,并指定它参照的键字段。也就是我们手动创建的表,这样django就会按照我们的要求来定义第三张表,而不会自己自动生成第三张表。

但其实用处不大,只是方便了查询而已!
  • 如果一定要用,请注意through_filed里面的顺序,由于是在project里面,所以project要放在元组的第一位!对应的第三张表也要把project放到第一位,不然会报错!


    image.png

你可能感兴趣的:(对django(ManytoMany)也就是m2m什么时候使用的一个困惑及解答)