django orm

Lingforme 2020-02-18

1.正查询和反查

从有外键关联的表中查询没有外键的表 ---正查询; 反之反查询.比如如下字段:

class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    email = models.CharField(max_length=32)
    ad = models.OneToOneField(to="AuthorDetail", on_delete=models.CASCADE)


class AuthorDetail(models.Model):
    address = models.CharField(max_length=32)
    telephone = models.IntegerField()

使用author对象查询AuthorDetail对象信息,则是正查. 反之反查询

正查询: 如下: ad指AuthorDetail对象

author = Author.objects.get(id=1)
author.name
‘金庸‘
author.ad.address
‘香港‘

反查询: 因为AuthorDetail没有记录Author表的关联属性,所以直接使用类名小写.

author_adress=AuthorDetail.objects.get(id=1)
author_adress.author
<Author: Author object (1)>
author_adress.author.name
‘金庸‘

反查询

方式一: 对象.类名_set.all()

class Article: tags = models.ManyToManyField(Tags, blank=True)

class Tags(models.Model):
    """
     标签 Tag 也比较简单,和 Category 一样。
     再次强调一定要继承 models.Model 类!
     """
    name = models.CharField(‘标签‘, max_length=100)

反查询即从Tags查询Article对象信息:

tags = Tags.objects.get(id=1)
out:<Tags: java标签1>
tags.article_set
out:<django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager object at 0x00000157FF7B16A0>
tags.article_set.get(id=1)
out: <Article: java基础>

方式二:使用使用relate_name

related_name=‘publisher‘
# 验证查询操作
class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32, default=None)
    create_time = models.DateTimeField(auto_now=True)
    price = models.DecimalField(decimal_places=2, max_digits=8, default=None)
    publisher = models.ForeignKey(to="Publish", on_delete=models.CASCADE,related_name=‘publisher‘)
    authors = models.ManyToManyField(to=‘Author‘,null=True,related_name=‘authors‘)
    reader=models.CharField(max_length=12,null=True)

    def __str__(self):
        return str(self.nid) + ‘:‘ + self.title


class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    email = models.CharField(max_length=32)

则反查询值:

p = Publish.objects.get(nid=1)
p.name
‘北京文化‘
p.publisher.all()
<QuerySet [<Book: 1:book_0>, <Book: 2:book_1>, <Book: 3:book_2>, <Book: 4:book_3>, <Book: 5:book_4>, <Book: 6:book_5>, <Book: 7:book_6>, <Book: 8:book_7>, <Book: 9:book_8>, <Book: 10:book_9>, <Book: 11:book_10>, <Book: 12:book_11>, <Book: 13:book_12>, <Book: 14:book_13>, <Book: 15:book_14>, <Book: 16:book_15>, <Book: 17:book_16>, <Book: 18:book_17>, <Book: 19:book_18>, <Book: 20:book_19>, ‘...(remaining elements truncated)...‘]>
 
 

相关推荐

inspuryhq / 0评论 2020-07-28