django 外键学习

1. 一个简单的外键用例,通过在子表声明ForeignKey可以将子表和表连接起来,其中是一对多的关系,即一个Musiccian有多个Album,一个Album只能属于一个Musician

from django.db import models

class Musician(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    instrument = models.CharField(max_length=100)

class Album(models.Model):
    artist = models.ForeignKey(Musician)
    name = models.CharField(max_length=100)
    release_date = models.DateField()
    num_stars = models.IntegerField()

2.列的选项:

      列的种类:model.DateField model.CharField model.IntegerField  等

      附加信息:max_length例如对于CharField而言可以采用max_length来限制最大长度

        default:设置默认值

        primary_key=True: 设置为主键

        unique=True:设置列的值必须是独一无二的  

                    choices: 强制列的属性只能在选项之中,举例如下:

from django.db import models

class Person(models.Model): SHIRT_SIZES = ( ('S', 'Small'), ('M', 'Medium'), ('L', 'Large'), ) name = models.CharField(max_length=60) shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)

                     through:通过一个中间关系model来建立多对多ER,举例如下

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=128)

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

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')

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

class Membership(models.Model):     # 中间关系表,额外的有一些信息date_joined invite_reason,这些信息是没法在Person表和Group表体现的
    person = models.ForeignKey(Person)   # 并且Group没办法通过Group.members.add() create() 直接赋值来添加成员,必须通过Membership表来添加成员
    group = models.ForeignKey(Group)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

 

3.表之间的关系,有ForeignKey(一对多)  ManyToManyField(多对多)  OneToOneField(一对一)

poll = models.ForeignKey(Poll, verbose_name="the related poll")
sites = models.ManyToManyField(Site, verbose_name="list of sites")
place = models.OneToOneField(Place, verbose_name="related place")

 

4.model method 可以在model中建立方法来处理一些事

5 可以override父类的方法,例如save()方法

from django.db import models

class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def save(self, *args, **kwargs):
        do_something()
        super(Blog, self).save(*args, **kwargs) # Call the "real" save() method.
        do_something_else()

 

6. 如何新建带外键的实例,直接将外键主表model的实例赋值给子表

     blog.title = request.POST['title']

     blog.author = request.user   # author 为外键  request.user为实例  

 

posted on 2015-08-17 10:26  梦见世界 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/lifeisshort/p/4735893.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值