【问题标题】:How to relate two Django models without Foreign Key in Django Rest Framework using PostgreSQL DB如何使用 PostgreSQL DB 在 Django Rest Framework 中关联两个没有外键的 Django 模型
【发布时间】:2021-12-17 22:09:31
【问题描述】:

如果我有两个 Django 模型,如下所示,与类别相关的书籍,当使用 Django Rest Framework 使用 PostgreSQL DB 使外键字段在 HTML 中可编辑时,我如何在不使用外键的情况下显示关系形式?

CATEGORIES = [
    ('Fiction', ('Fiction')),
    ('Non-Fiction', ('Non-Fiction'))
]

class Category(models.Model):
   category_name = models.CharField(max_length=255, choices=CATEGORIES)

class Book(models.Model):
   title = models.CharField(max_length=255)
   author = models.CharField(max_length=255)
   pages = models.IntergerField(max_length=255)
   category = models.ForeignKey(Category, on_delete=models.CASCADE)

book 表中的类别列表示为category_id 时,我的挑战出现在数据库中,它们是整数。这会在执行 CRUD 功能时产生问题,尤其是 EDIT,因为我无法在表单中从前端编辑类别,因为它表示为 1,2,3..... 而不是实际类别。我想通过 REST API 来实现这一点。

我的序列化器

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

我的 API 视图

@api_view(['POST'])
def AddBookAPI(request):
    serializer = BookSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)

    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

@api_view(['PUT'])
def EditBookAPI(request, id):
    book_record =get_object_or_404(Book, id=id)
    serializer = BookSerializer(instance=book_record, data=request.data)
    if serializer.is_valid(raise_exception=True):
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)

    return Response(serializer.errors, status=status.HTTP_304_NOT_MODIFIED)

@api_view(['DELETE'])
def DeleteBookAPI(request, id):
    book = get_object_or_404(Book, id=id)
    book.delete()

    return Response('Book Record Successfully Deleted!', status=status.HTTP_200_OK)

还有一个示例响应

    {
        "id": 1,
        "title": "The Green Light",
        "author": "Peris Fuller",
        "pages": 456,
        "category": 2,
    },

对此的任何帮助将不胜感激。

【问题讨论】:

    标签: django postgresql django-rest-framework foreign-keys


    【解决方案1】:

    在您的模型中添加 __str____unicode__ 方法,这将帮助您在 UI 上显示名称而不是 id。

    这样分享了两种方法的例子:-

    class Category(models.Model):
       category_name = models.CharField(max_length=255, choices=CATEGORIES)
    
        def __unicode__(self):
            return self.category_name
    
        def __str__(self):
            return self.category_name
    

    在您的 BookSerializer 中,您可以在 Category 模型中查找 id 或名称并相应地映射值。

    【讨论】:

    • 我的代码中有__str____unicode__。我只是没有把它放在我的问题中。不过还是谢谢你。
    【解决方案2】:

    id 用于categories 可能没问题。 如果要从前端编辑,请发出get 请求以获取所有类别(您没有报告category 序列化器,但必须有idcategory_name)。

    我猜您想通过选择菜单更改类别。如果是这样,请将每个选项与每个类别的id 关联为值,将每个类别的category_name 关联为要显示的文本。

    当你去编辑模型时,你将再次序列化id,但你将能够读取category_name

    【讨论】:

    • 非常感谢。您的回答使我朝着正确的方向前进。非常感谢!
    猜你喜欢
    • 2020-02-03
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2018-08-04
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多