• One-to-one


    创建模型

    在本例中,Place 和 Restaurant 为一对一关系

    from django.db import models
    
    class Place(models.Model):
        name = models.CharField(max_length=50)
        address = models.CharField(max_length=80)
    
        def __str__(self):
            return "%s the place" % self.name
    
    class Restaurant(models.Model):
        place = models.OneToOneField(
            Place,
            on_delete=models.CASCADE,
            primary_key=True,
        )
        serves_hot_dogs = models.BooleanField(default=False)
        serves_pizza = models.BooleanField(default=False)
    
        def __str__(self):
            return "%s the restaurant" % self.place.name
    
    class Waiter(models.Model):
        restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
        name = models.CharField(max_length=50)
    
        def __str__(self):
            return "%s the waiter at %s" % (self.name, self.restaurant)
    View Code

    数据迁移

    #生成迁移文件,记录下在models.py文件中的改动
    python manage.py makemigrations 
    
    ##将改动的内容作用于数据库,生成相应的数据
    python manage.py migrate

    表操作

    创建数据

    >>> #创建几个地点
    >>> p1 = Place(name='Demon Dogs', address='944 W. Fullerton')
    >>> p1.save()
    >>> p2 = Place(name='Ace Hardware', address='1013 N. Ashland')
    >>> p2.save()
    
    >>> #创建一家餐厅
    >>>r=Restaurant(place=p1,serves_hot_dogs=True,
    serves_pizza=False)
    >>> r.save()
    
    >>>#Restaurant 可以访问 Place
    >>> r.place
    <Place: Demon Dogs the place>
    
    >>>#Place 可以访问 Restaurant
    >>> p1.restaurant
    <Restaurant: Demon Dogs the restaurant>
    
    >>>#P2没有关联餐厅 可以通过捕获异常,避免出错
    >>> from django.core.exceptions import ObjectDoesNotExist
    >>> try:
    >>>     p2.restaurant
    >>> except ObjectDoesNotExist:
    >>>     print("There is no restaurant here.")
    There is no restaurant here.
    
    >>>#也可以通过 hasattr() 获取是否有某个属性来判断
    >>> hasattr(p2, 'restaurant')
    False
    
    >>>#使用赋值符号设置place 。因为Place是restaurant的主键,所以保存将创建一个新的restaurant,将之前的restaurant
    >>> r.place = p2
    >>> r.save()
    >>> p2.restaurant
    <Restaurant: Ace Hardware the restaurant>
    >>> r.place
    <Place: Ace Hardware the place>
    
    >>>#再次设置place,在反向使用赋值:
    >>> p1.restaurant = r
    >>> p1.restaurant
    <Restaurant: Demon Dogs the restaurant>
    View Code

    查询数据

    >>>#all()只返回餐馆,而不是地方。注意有两个餐馆, Ace硬件餐厅是在对r.place=p2的调用中创建的
    
    >>> Restaurant.objects.all()
    <QuerySet [<Restaurant: Demon Dogs the restaurant>, <Restaurant: Ace Hardware the restaurant>]>
    
    >>>#all()返回所有位置,不管它们是否有餐馆
    >>> Place.objects.order_by('name')
    <QuerySet [<Place: Ace Hardware the place>, <Place: Demon Dogs the place>]>
    
    >>>#可以使用跨关系查找
    >>> Restaurant.objects.get(place=p1)
    <Restaurant: Demon Dogs the restaurant>
    >>> Restaurant.objects.get(place__pk=1)
    <Restaurant: Demon Dogs the restaurant>
    >>> Restaurant.objects.filter(place__name__startswith="Demon")
    <QuerySet [<Restaurant: Demon Dogs the restaurant>]>
    >>> Restaurant.objects.exclude(place__address__contains="Ashland")
    <QuerySet [<Restaurant: Demon Dogs the restaurant>]>
    
    >>>#反向查找也是可以的
    >>> Place.objects.get(pk=1)
    <Place: Demon Dogs the place>
    >>> Place.objects.get(restaurant__place=p1)
    <Place: Demon Dogs the place>
    >>> Place.objects.get(restaurant=r)
    <Place: Demon Dogs the place>
    >>> Place.objects.get(restaurant__place__name__startswith="Demon")
    <Place: Demon Dogs the place>
    
    >>>#在餐厅里加一个waiter
    >>> w = r.waiter_set.create(name='Joe')
    >>> w
    <Waiter: Joe the waiter at Demon Dogs the restaurant>
    
    >>>#访问服务员
    >>> Waiter.objects.filter(restaurant__place=p1)
    <QuerySet [<Waiter: Joe the waiter at Demon Dogs the restaurant>]>
    >>> Waiter.objects.filter(restaurant__place__name__startswith="Demon")
    <QuerySet [<Waiter: Joe the waiter at Demon Dogs the restaurant>]>
    View Code
  • 相关阅读:
    转:专题五线程同步——事件构造
    转:专题四线程同步
    转:专题三线程池中的I/O线程
    转:[C# 开发技巧]如何防止程序多次运行
    转:专题二线程池中的工作者线程
    转:专题一线程基础
    C# 设置按钮快捷键
    jmeter链接多台负载机报错
    java读取properties
    使用Runtime.getRuntime().exec()方法的几个陷阱
  • 原文地址:https://www.cnblogs.com/crazy-zjl/p/10266091.html
Copyright © 2020-2023  润新知