Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有预填充模型的DRF一对一关系序列化程序_Python_Django_Django Models_Serialization_Django Rest Framework - Fatal编程技术网

Python 具有预填充模型的DRF一对一关系序列化程序

Python 具有预填充模型的DRF一对一关系序列化程序,python,django,django-models,serialization,django-rest-framework,Python,Django,Django Models,Serialization,Django Rest Framework,我有两个模型,其中一个已经填充了数据(书名/章节号/段落号数据),我正在为每个用户实现该功能,以便能够为每个唯一的书名/章节号/段落号添加注释,我可以,但我已经在书堆里呆了几天了,试图检索当前用户的相关名称注释的书籍(如果有的话)。以下是我的模型: Book已填充数据的模型 from django.db import models class Book(models.Model): day = models.CharField(max_length=128) book = m

我有两个模型,其中一个已经填充了数据(书名/章节号/段落号数据),我正在为每个用户实现该功能,以便能够为每个唯一的书名/章节号/段落号添加注释,我可以,但我已经在书堆里呆了几天了,试图检索当前用户的
相关名称
注释
的书籍(如果有的话)。以下是我的模型:

Book
已填充数据的模型

from django.db import models


class Book(models.Model):
    day = models.CharField(max_length=128)
    book = models.CharField(max_length=128)
    chapter = models.CharField(max_length=256)
    paragraph = models.CharField(max_length=256)
    text = models.TextField()
    link = models.CharField(max_length=256)

    def __str__(self):
        return f'{self.book}_{self.chapter}.{self.paragraph} '

    class Meta:
        ordering = ['-id']
        verbose_name = "Paragraph"
        verbose_name_plural = "Paragraph"
以下是
注释
模型,该模型应存储当前用户关于特定唯一书名/章节号/段落号的注释:

from django.db import models
from django.conf import settings
from rest_framework.reverse import reverse
from paragraphs.models import Book

class Note(models.Model):
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='author', on_delete=models.CASCADE)
    paragraph = models.ForeignKey(Book, related_name='note', on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    text = models.TextField(default=None)

    def __str__(self):
        return f'Note on {self.paragraph}' 

    class Meta:
        ordering = ['created']

    def save(self, *args, **kwargs):
        """
        """
        options = {'text': self.text} if self.text else {}
        super(Note, self).save(*args, **kwargs)

    def get_absolute_url(self): 
        return reverse('note-detail', args=[self.id])
以下是我的序列化程序:

Book
序列化程序

from rest_framework import serializers
from .models import Book


class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'
from rest_framework import serializers
from .models import Note
from users.serializers import UserSerializer
from paragraphs.serializers import BookSerializer


class NoteSerializer(serializers.ModelSerializer):
    owner = UserSerializer(many=False, read_only=True)

    class Meta:
        model = Note
        fields = ['id', 'owner', 'paragraph', 'text', 'created']

    def to_representation(self, instance):
        self.fields['paragraph'] = BookSerializer(read_only=True)
        return super(NoteSerializer, self).to_representation(instance)

    def user(self):
        request = self.context.get('request', None)
        if request:
            return request.user
        return None

    def create(self, validated_data):
        note, _ = Note.objects.update_or_create(
            owner=self.user(),
            paragraph=validated_data.get('paragraph', None),
            defaults={'text': validated_data.get('text', None)})
        return note
注意
序列化程序

from rest_framework import serializers
from .models import Book


class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'
from rest_framework import serializers
from .models import Note
from users.serializers import UserSerializer
from paragraphs.serializers import BookSerializer


class NoteSerializer(serializers.ModelSerializer):
    owner = UserSerializer(many=False, read_only=True)

    class Meta:
        model = Note
        fields = ['id', 'owner', 'paragraph', 'text', 'created']

    def to_representation(self, instance):
        self.fields['paragraph'] = BookSerializer(read_only=True)
        return super(NoteSerializer, self).to_representation(instance)

    def user(self):
        request = self.context.get('request', None)
        if request:
            return request.user
        return None

    def create(self, validated_data):
        note, _ = Note.objects.update_or_create(
            owner=self.user(),
            paragraph=validated_data.get('paragraph', None),
            defaults={'text': validated_data.get('text', None)})
        return note
我得到的数据是:

{
    "id": 25,
    "day": "2",
    "book": "Some book",
    "chapter": "1",
    "paragraph": "3",
    "text": "This is an example text that the user would like to attach a note to",
    "link": "https://somelink.com",
}
我试图获取的数据:

{
    "id": 25,
    "day": "2",
    "book": "Some book",
    "chapter": "1",
    "paragraph": "3",
    "text": "This is an example text that the user would like to attach a note to",
    "link": "https://somelink.com",
    "note": "note of current user or none"
}

非常感谢您的帮助。py:

class Book(models.Model):
    day = models.CharField(max_length=128)
    book = models.CharField(max_length=128)
    chapter = models.CharField(max_length=256)
    paragraph = models.CharField(max_length=256)
    text = models.TextField()
    link = models.CharField(max_length=256)

    def __str__(self):
        return f'{self.book}_{self.chapter}.{self.paragraph} '

    class Meta:
        ordering = ['-id']

class Note(models.Model):
    owner = models.ForeignKey(to = User, related_name='author', on_delete=models.CASCADE)
    book = models.ForeignKey(Book, related_name='note', on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    text = models.TextField(default=None)
    
    def __str__(self):
        return '%s(%s)' %(self.owner,self.book)
class NoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Note
        fields = ['id', 'owner', 'book', 'text', 'created']
        
class BookSerializer(serializers.ModelSerializer):
    note = serializers.StringRelatedField(many=True, read_only=True)
    # note = NoteSerializer(many=True, read_only=True)
    class Meta:
        model = Book
        fields = ['day','book','chapter','paragraph','text','link','note']
{
    "day": "2",
    "book": "some book",
    "chapter": "1",
    "paragraph": "example",
    "text": "some textttttttttttttttttttttttttttttttttttttttttttttttt",
    "link": "http://127.0.0.1:8000/admin/api/book/add/",
    "note": [
        "admin(some book_1.example )"
    ]
}
{
    "day": "2",
    "book": "some book",
    "chapter": "1",
    "paragraph": "example",
    "text": "some textttttttttttttttttttttttttttttttttttttttttttttttt",
    "link": "http://127.0.0.1:8000/admin/api/book/add/",
    "note": [
        {
            "id": 2,
            "owner": 1,
            "book": 1,
            "text": "saaaaaaaaaaaaaaaaaaa",
            "created": "2021-02-24T14:34:13.279750Z"
        }
    ]
}
序列化程序。py:

class Book(models.Model):
    day = models.CharField(max_length=128)
    book = models.CharField(max_length=128)
    chapter = models.CharField(max_length=256)
    paragraph = models.CharField(max_length=256)
    text = models.TextField()
    link = models.CharField(max_length=256)

    def __str__(self):
        return f'{self.book}_{self.chapter}.{self.paragraph} '

    class Meta:
        ordering = ['-id']

class Note(models.Model):
    owner = models.ForeignKey(to = User, related_name='author', on_delete=models.CASCADE)
    book = models.ForeignKey(Book, related_name='note', on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    text = models.TextField(default=None)
    
    def __str__(self):
        return '%s(%s)' %(self.owner,self.book)
class NoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Note
        fields = ['id', 'owner', 'book', 'text', 'created']
        
class BookSerializer(serializers.ModelSerializer):
    note = serializers.StringRelatedField(many=True, read_only=True)
    # note = NoteSerializer(many=True, read_only=True)
    class Meta:
        model = Book
        fields = ['day','book','chapter','paragraph','text','link','note']
{
    "day": "2",
    "book": "some book",
    "chapter": "1",
    "paragraph": "example",
    "text": "some textttttttttttttttttttttttttttttttttttttttttttttttt",
    "link": "http://127.0.0.1:8000/admin/api/book/add/",
    "note": [
        "admin(some book_1.example )"
    ]
}
{
    "day": "2",
    "book": "some book",
    "chapter": "1",
    "paragraph": "example",
    "text": "some textttttttttttttttttttttttttttttttttttttttttttttttt",
    "link": "http://127.0.0.1:8000/admin/api/book/add/",
    "note": [
        {
            "id": 2,
            "owner": 1,
            "book": 1,
            "text": "saaaaaaaaaaaaaaaaaaa",
            "created": "2021-02-24T14:34:13.279750Z"
        }
    ]
}
输出:

class Book(models.Model):
    day = models.CharField(max_length=128)
    book = models.CharField(max_length=128)
    chapter = models.CharField(max_length=256)
    paragraph = models.CharField(max_length=256)
    text = models.TextField()
    link = models.CharField(max_length=256)

    def __str__(self):
        return f'{self.book}_{self.chapter}.{self.paragraph} '

    class Meta:
        ordering = ['-id']

class Note(models.Model):
    owner = models.ForeignKey(to = User, related_name='author', on_delete=models.CASCADE)
    book = models.ForeignKey(Book, related_name='note', on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    text = models.TextField(default=None)
    
    def __str__(self):
        return '%s(%s)' %(self.owner,self.book)
class NoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Note
        fields = ['id', 'owner', 'book', 'text', 'created']
        
class BookSerializer(serializers.ModelSerializer):
    note = serializers.StringRelatedField(many=True, read_only=True)
    # note = NoteSerializer(many=True, read_only=True)
    class Meta:
        model = Book
        fields = ['day','book','chapter','paragraph','text','link','note']
{
    "day": "2",
    "book": "some book",
    "chapter": "1",
    "paragraph": "example",
    "text": "some textttttttttttttttttttttttttttttttttttttttttttttttt",
    "link": "http://127.0.0.1:8000/admin/api/book/add/",
    "note": [
        "admin(some book_1.example )"
    ]
}
{
    "day": "2",
    "book": "some book",
    "chapter": "1",
    "paragraph": "example",
    "text": "some textttttttttttttttttttttttttttttttttttttttttttttttt",
    "link": "http://127.0.0.1:8000/admin/api/book/add/",
    "note": [
        {
            "id": 2,
            "owner": 1,
            "book": 1,
            "text": "saaaaaaaaaaaaaaaaaaa",
            "created": "2021-02-24T14:34:13.279750Z"
        }
    ]
}
返回所有字段:

class NoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Note
        fields = ['id', 'owner', 'book', 'text', 'created']
        
class BookSerializer(serializers.ModelSerializer):
    # note = serializers.StringRelatedField(many=True, read_only=True)
    note = NoteSerializer(many=True, read_only=True)
    class Meta:
        model = Book
        fields = ['day','book','chapter','paragraph','text','link','note']
输出:

class Book(models.Model):
    day = models.CharField(max_length=128)
    book = models.CharField(max_length=128)
    chapter = models.CharField(max_length=256)
    paragraph = models.CharField(max_length=256)
    text = models.TextField()
    link = models.CharField(max_length=256)

    def __str__(self):
        return f'{self.book}_{self.chapter}.{self.paragraph} '

    class Meta:
        ordering = ['-id']

class Note(models.Model):
    owner = models.ForeignKey(to = User, related_name='author', on_delete=models.CASCADE)
    book = models.ForeignKey(Book, related_name='note', on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    text = models.TextField(default=None)
    
    def __str__(self):
        return '%s(%s)' %(self.owner,self.book)
class NoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Note
        fields = ['id', 'owner', 'book', 'text', 'created']
        
class BookSerializer(serializers.ModelSerializer):
    note = serializers.StringRelatedField(many=True, read_only=True)
    # note = NoteSerializer(many=True, read_only=True)
    class Meta:
        model = Book
        fields = ['day','book','chapter','paragraph','text','link','note']
{
    "day": "2",
    "book": "some book",
    "chapter": "1",
    "paragraph": "example",
    "text": "some textttttttttttttttttttttttttttttttttttttttttttttttt",
    "link": "http://127.0.0.1:8000/admin/api/book/add/",
    "note": [
        "admin(some book_1.example )"
    ]
}
{
    "day": "2",
    "book": "some book",
    "chapter": "1",
    "paragraph": "example",
    "text": "some textttttttttttttttttttttttttttttttttttttttttttttttt",
    "link": "http://127.0.0.1:8000/admin/api/book/add/",
    "note": [
        {
            "id": 2,
            "owner": 1,
            "book": 1,
            "text": "saaaaaaaaaaaaaaaaaaa",
            "created": "2021-02-24T14:34:13.279750Z"
        }
    ]
}

实际上,您试图实现的是让NoteSerializer包含来自外键相关书籍模型的字段。重写序列化程序的to_表示方法很笨拙,不是一条可行之路。查看更好的方法。

谢谢您的回复,先生。但是我收到了错误的AttributeError:“Book”对象没有属性“owner”,有什么想法吗?非常感谢。again@MurphyAdam我编辑了我的答案…我在我的机器上尝试了你的问题。它完全有效…谢谢你的支持和时间。我很感激!谢谢你的回复。我很感激。我跟随链接并尝试应用我认为从文章中理解的内容,但我得到以下错误:django.db.utils.ProgrammingError:column notes\u note.book\u id不存在第1行:…选择“notes\u note”。“id”,“notes\u note”。“owner\u id”,“没有。请问,我写模型的方式有什么问题吗?如果不看代码,很难判断出什么是错的。从技术上讲,您的模型似乎是合理的,但是从建模(以及可读性和可维护性)的角度来看,它们非常混乱。特别是,在书本模型上有一个“book”字段是没有意义的。是的,你是对的,我相信这个模型最好的名字应该是“Lesson”,它也避免了混淆。谢谢你的帮助。啊,当你没有说密码的时候,你能告诉我你的意思是什么吗?@MurphyAdam我指的是你的评论:“我跟踪了链接,试图应用我认为我从帖子中理解的东西”啊,是的。我设置note=serializers.RelatedField(read_only=True),并添加了depth=1。你认为有更好的方法吗?我觉得我做这件事的方式不对