django

django-model外键关系之一对多

2018-08-22  本文已影响520人  陆_志东

一对多

外键字段是放在多的一方模型类里面的

比如,一辆汽车(Car)有一个制造商(Manufacturer) —— 但是一个制造商(Manufacturer) 生产很多汽车(Car),每一辆汽车(Car) 只能有一个制造商(Manufacturer) —— 使用下面的定义:

from django.db import models

class Manufacturer(models.Model):
    # ...
    pass

class Car(models.Model):
    company_that_makes_it = models.ForeignKey(Manufacturer)

如果想要创建和自己关联的一对多关系,使用self指向自己

models.ForeignKey('self')

一对多的使用和绑定

准备数据

比如有下面两个模型类

from django.db import models

class Reporter(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField()

    def __str__(self):              # __unicode__ on Python 2
        return "%s %s" % (self.first_name, self.last_name)

class Article(models.Model):
    headline = models.CharField(max_length=100)
    pub_date = models.DateField()
    reporter = models.ForeignKey(Reporter)

    def __str__(self):              # __unicode__ on Python 2
        return self.headline

    class Meta:
        ordering = ('headline',)

关联对象

默认方式

# 创建几个Reporter:
>>> r = Reporter(first_name='John', last_name='Smith', email='john@example.com')
>>> r.save()

>>> r2 = Reporter(first_name='Paul', last_name='Jones', email='paul@example.com')
>>> r2.save()
#创建一个Article:
>>> from datetime import date
>>> a = Article(id=None, headline="This is a test", pub_date=date(2005, 7, 27), reporter=r)
>>> a.save()

>>> a.reporter.id
1

>>> a.reporter
<Reporter: John Smith>

# 注意,将对象分配给一个外键之前必须保存。例如,使用未保存的Reporter 创建Article 将引发ValueError:
>>> r3 = Reporter(first_name='John', last_name='Smith', email='john@example.com')
>>> Article(headline="This is a test", pub_date=date(2005, 7, 27), reporter=r3)
Traceback (most recent call last):
...
ValueError: 'Cannot assign "<Reporter: John Smith>": "Reporter" instance isn't saved in the database.'

#访问关联对象,具体看模型的查询
>>> r = a.reporter
>>> r.first_name, r.last_name
('John', 'Smith')

除了上面的方式外还有几个内建的关联对象的方法,add,create,remove,clear

外键关联对象的查找(或者说是索引也可以说是获取)或者说是关联模型的反向查询

比如有两个模型类A和B,A是多的一方,B是一的一方,外键字段是设置在多的一方里面的

上一篇下一篇

猜你喜欢

热点阅读