Django中的一对一、一对多与多对多

一: 一对一

首先创建一个django项目,并且在设置里进行配置,连接到Mysql 数据库,在myApp 文件夹的 models 文件进行如下配置, 表示创建两个数据表,里面各有自己的字段,
其中第二个数据表Card 的最后一个字段person,为链接到数据表Person

from django.db import models

# Create your models here.

class People(models.Model):
    name = models.CharField(max_length=20)
    sex = models.NullBooleanField(null=True, default=True)
    age = models.IntegerField(null=True)


class Card(models.Model):
    code = models.CharField(max_length=20)
    address = models.CharField(max_length=100)
    person = models.OneToOneField(People, on_delete=models.CASCADE, primary_key=True)

然后再view.py 文件中进行如下配置,并在Url.py 中进行相应的配置

from django.shortcuts import render
from django.http import HttpResponse
from .models import People, Card

def index(reuqest):
    p1 = People(name='大一', age=11, sex=True)
    p2 = People(name='大二', age=12, sex=True)
    p3 = People(name='大三', age=13, sex=True)
    p4 = People(name='大四', age=14, sex=True)
    # p1.save()
    # p2.save()
    # p3.save()
    # p4.save()

    c1 = Card(person=p3, code='3333', address='地址3')
    c2 = Card(person=p4, code='4444', address='地址4')
    c3 = Card(person=p2, code='2222', address='地址2')
    c4 = Card(person=p1, code='1111', address='地址1')

    # c1.save()
    # c2.save()
    # c3.save()
    # c4.save()

    return HttpResponse('fuck')
#
def select(request):
    c4 = Card.objects.get(address='地址1')
    print(c4.code)  # 1111
    print(c4.person.name) # 大一

    c3 = Card.objects.get(address='地址2')
    print(c3.person.name) # 大二

    # 获取和card 对象绑定的对象中的name 字段
    # 这个要是反着理解的话,可能会好一点?
    # 比如 找到name='大三',是p3,
    # 再找p3对应的person, 是c1,
    # 最后打印c1的地址,输出 地址3
    c1 = Card.objects.get(person__name='大三')
    print(c1.address)   # 地址3

    c1_ = Card.objects.get(code='3333')
    print(c1_.address)  # 地址3

    # 获取和people对象绑定的对象中的address字段
    p1 = People.objects.get(card__address='地址1')
    print(p1.name)  # 大一

    return HttpResponse('you')

二: 一对多

所有的都与前面的一样,只是models.py 和 views.py 两个文件不同,所以只对这两个文件进行说明
models.py 文件:

from django.db import models

# Create your models here.

class People(models.Model):
    name = models.CharField(max_length=50)
    card_num = models.CharField(max_length=100, default=0)
    # 重新设置表名
    class Meta:
        db_table = 'people'


class Card(models.Model):
    number = models.CharField(max_length=20)
    person = models.ForeignKey(People, on_delete=models.CASCADE)
    source = models.CharField(max_length=50)
    class Meta:
        db_table = 'Card'

views.py 文件

from django.shortcuts import render
from django.http import HttpResponse
from .models import People, Card

def index(request):
    p1 = People.objects.create(name='小王', card_num=4)
    p2 = People.objects.create(name='老王', card_num=40)

    c1 = Card(number='101', source='中国银行', person=p1)
    c2 = Card(number='102', source='中国农行', person=p1)
    c3 = Card(number='103', source='中国建行', person=p1)

    c4 = Card(number='201', source='python', person=p2)
    c5 = Card(number='202', source='Java', person=p2)
    c6 = Card(number='203', source='NodeJS', person=p2)
    c7 = Card(number='204', source='HTML5', person=p2)

    # c1.save()
    # c2.save()
    # c3.save()
    # c4.save()
    # c5.save()
    # c6.save()
    # c7.save()

    return HttpResponse('hahah')

def select(request):
    c1 = Card.objects.get(number='203')
    print(c1.person.name)  # 老王

    c2 = Card.objects.get(id=3)
    print(c2.person.name) # 小王


    result = c2.person.card_set.all()
    print(result)  # c2 所有字段的集合
    for res in result:
        # print(res)  # Card object (1) Card object (2)  Card object (3)
        # print(res.source) # 中国银行 中国农行 中国建行
        # print(res.person) # People object (1) People object (1) People object (1)
        print(res.person.name)  # 小王   小王  小王


    result = People.objects.get(name='老王')
    for card in result.card_set.all():
        print(card.source)  # pythonJavaNodeJSHTML5

    return HttpResponse('fuck')

三: 多对多

没运行出来, 还得再磨磨

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值