Как связать две модели 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 и отображать значения соответствующим образом.

Вернуться на верх