如果我有兩個 Django 模型,如下所示,Book 與 Category 相關,當使用 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因為我無法在表單中從前端編輯類別,因為它表示為 ie1,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,
},
對此的任何幫助將不勝感激。
uj5u.com熱心網友回復:
擁有idfor可能沒問題categories。如果要從前端編輯,get請請求獲取所有類別(您沒有報告category序列化程式,但必須有id和category_name)。
我猜您想通過選擇選單更改類別。如果是,將每個選項與id每個類別的關聯為值,將category_name每個類別的關聯為要顯示的文本。
當您去編輯模型時,您將id再次序列化,但您將能夠讀取category_name.
uj5u.com熱心網友回復:
在您的模型中添加__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,你可以查找的ID或名字到Category模型和相應的值映射。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/346938.html
標籤:姜戈 PostgreSQL Django 休息框架 外键
上一篇:如何在pgAdmin4中保存更改
