请教个django的orm问题?

请教个django的orm问题?

models 如下

from django.db import models

# Create your models here.

class Book(models.Model):

title = models.CharField(max_length=32)

price = models.DecimalField(max_digits=5, decimal_places=2)

pub_date = models.DateField()

publish = models.ForeignKey(

to="Publish", to_field="id", on_delete=models.CASCADE)

authors = models.ManyToManyField(to="Author")

class Publish(models.Model):

name = models.CharField(max_length=32)

city = models.CharField(max_length=32)

email = models.EmailField()

class Author(models.Model):

name = models.CharField(max_length=32)

age = models.IntegerField()

email = models.EmailField()

au_detail = models.OneToOneField(

to="AuthorDetail", to_field="id", on_delete=models.CASCADE)

class AuthorDetail(models.Model):

gender_choices = (

(0, '女'),

(1, '男'),

(2, '保密'),

)

gender = models.SmallIntegerField(choices=gender_choices)

tel = models.CharField(max_length=32)

address = models.CharField(max_length=64)

birthday = models.DateField()

我有个接口,想获取全部的book,包含详情信息:
代码如下:

def getList(request):

# 查询所有书籍 包含出版社信息 和 作者信息

bookList = Book.objects.filter(title='西游记').all()

dataLen = len(bookList)

result = []

for book in bookList:

authors = []

for i in book.authors.all():

author_dict = {

'name': i.name,

'age': i.age,

'email': i.email,

'au_detail': model_to_dict(i.au_detail)

}

authors.append(author_dict)

book_dict = {

'id': book.id,

'title': book.title,

'price': book.price,

'pub_date': book.pub_date,

'publish': model_to_dict(book.publish),

'authors': authors

}

result.append(book_dict)

return JsonResponse({

'data': result,

'length': dataLen,

'success': True,

}, safe=False)

def findBy(request):

# 通过书籍id查询详情

id = request.GET.get('id')

book = Book.objects.filter(id=id).first()

book_dict = model_to_dict(book)

book_dict['publish'] = model_to_dict(book.publish)

for author in book.authors.all():

book_dict['authors'] = model_to_dict(author)

book_dict['authors']['au_detail'] = model_to_dict(author.au_detail)

gender_choices = {

0: '女',

1: '男',

2: '保密'

}

book_dict['authors']['au_detail']['gender'] = gender_choices[book_dict['authors']

['au_detail']['gender']]

return JsonResponse({

'data': book_dict,

'success': True,

}, safe=False)

可以实现。总觉得这样好像很麻烦。请问是这样写的吗?


回答:

from django.forms.models import model_to_dict

def book_to_dict(book):

authors_data = []

for author in book.authors.all():

author_data = model_to_dict(author)

author_data['au_detail'] = model_to_dict(author.au_detail)

gender_choices = {

0: '女',

1: '男',

2: '保密'

}

author_data['au_detail']['gender'] = gender_choices[author_data['au_detail']['gender']]

authors_data.append(author_data)

return {

'id': book.id,

'title': book.title,

'price': book.price,

'pub_date': book.pub_date,

'publish': model_to_dict(book.publish),

'authors': authors_data

}

def getList(request):

books = Book.objects.filter(title='西游记').select_related('publish').prefetch_related('authors', 'authors__au_detail')

books_data = [book_to_dict(book) for book in books]

return JsonResponse({

'data': books_data,

'length': len(books_data),

'success': True,

}, safe=False)

def findBy(request):

book_id = request.GET.get('id')

book = Book.objects.filter(id=book_id).select_related('publish').prefetch_related('authors', 'authors__au_detail').first()

if not book:

return JsonResponse({

'error': 'Book not found',

'success': False

}, status=404)

book_data = book_to_dict(book)

return JsonResponse({

'data': book_data,

'success': True,

}, safe=False)


回答:

使用 select_related

直接一步到位

books = Book.objects.filter(title='西游记').select_related('authors__au_detail').all()

以上是 请教个django的orm问题? 的全部内容, 来源链接: utcz.com/p/939038.html

回到顶部