多对多关联关系的三种方式

2018-11-19  本文已影响0人  aq_wzj

1. 自行创建第三张表

class Book(models.Model):
    title = models.CharField(max_length=32, verbose_name="书名")


class Author(models.Model):
    name = models.CharField(max_length=32, verbose_name="作者姓名")


# 自己创建第三张表,分别通过外键关联书和作者
class Author2Book(models.Model):
    author = models.ForeignKey(to="Author")
    book = models.ForeignKey(to="Book")

    class Meta:
        unique_together = ("author", "book")

2. 通过ManyToManyField自动创建第三张表

class Book(models.Model):
    title = models.CharField(max_length=32, verbose_name="书名")


# 通过ORM自带的ManyToManyField自动创建第三张表
class Author(models.Model):
    name = models.CharField(max_length=32, verbose_name="作者姓名")
    books = models.ManyToManyField(to="Book", related_name="authors")

3. 设置ManyTomanyField并指定自行创建的第三张表

class Book(models.Model):
    # 默认会创建id
    name = models.CharField(max_length=32)
    # 中介模型,手动指定第三张中间表是Book2Author
    authors=models.ManyToManyField(to='Author',through='Book2Author',through_fields=('book','author'))
    
class Author(models.Model):
    name = models.CharField(max_length=32)
        
class Book2Author(models.Model):
    id = models.AutoField(primary_key=True)
    book=models.ForeignKey(to='Book',to_field='id')
    author=models.ForeignKey(to='Author',to_field='id')
                
through:来指定我的第三张表是哪个
through_fields:('book','author'),第一个值是:从中间表找到设置关联字段的表,通过哪个字段,第一个位置就写它
        
终极总结:防止混了:关联字段就是表名小写,第一个值:就是当前表的表名小写

第三张表,可以添加别的字段
上一篇 下一篇

猜你喜欢

热点阅读