Как связать две модели Django без внешнего ключа в Django Rest Framework с помощью БД PostgreSQL
Если у меня есть две модели Django, как показано ниже, с Book, связанными с Category, как еще я могу показать связь без использования Foreign Key при использовании Django Rest Framework, используя PostgreSQL DB, чтобы сделать поле Foreign Key редактируемым в 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,
},
Любая помощь по этому вопросу будет принята с благодарностью.
Возможно, не помешает id
для categories
.
Если вы хотите редактировать из фронтенда, сделайте get
запрос, чтобы получить все категории (вы не сообщили category
сериализатор, но должны быть id
и category_name
).
Полагаю, вы хотите менять категории через меню выбора. Если это так, свяжите каждый вариант с id
каждой категории в качестве значения и category_name
каждой категории в качестве текста, который будет отображаться.
Когда вы перейдете к редактированию модели, вы снова сериализуете id
, но сможете прочитать category_name
.
Добавьте __str__
или __unicode__
методы в ваши модели, которые помогут вам отображать имя вместо id в UI.
Подобный общий пример обоих методов:-
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
и отображать значения соответствующим образом.