Как решить, что после запроса поиска имя свойства изменилось на id свойства?
Я использую веб-приложение React Native Expo для фронтенда и Django для бэкенда.
У меня есть функция поиска, которая работает нормально. Но проблема, с которой я столкнулся, заключается в том, что после поиска название свойства конкретного животного изменилось на идентификатор свойства (номер).
Я имею в виду, что в аккордеоне отображается название категории. Но после поиска отображается id категории.
Во фронтенде у меня есть аккордеон с некоторыми свойствами. Свойство для категории выглядит так:
export const AccordionItemsProvider = ({ children }) => {
const [categoryExpanded, setCategory] = useState(false);
const accordionItems = (item) => {
return (
<>
<List.Accordion
title="Familie"
expanded={categoryExpanded}
onPress={() => setCategory(!categoryExpanded)}>
<Text>{item.category}</Text>
</List.Accordion>
</>
);
};
return (
<AccordionItemsContext.Provider
value={{
accordionItems,
}}>
{children}
</AccordionItemsContext.Provider>
);
};
Таким образом, будет выведено название категории. Но после поиска будет выведен id категории. А не название.
Контекст поиска животных выглядит так:
/* eslint-disable prettier/prettier */
import React, { createContext, useEffect, useState } from "react";
import { fetchAnimalData } from "./animal/animal.service";
import useDebounce from "../hooks/use-debounce";
export const SearchAnimalContext = createContext();
export const SearchAnimalContextProvider = ({ children }) => {
const [searchAnimal, setSearchAnimal] = useState([]);
const [results, setResults] = useState([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const [input, setInput] = useState("");
const debounce = useDebounce(input, 500);
useEffect(() => {
if (debounce === "") {
setResults([]);
return;
}
fetchAnimalData(debounce)
.then((response) => {
setResults(response);
})
.catch((err) => {
setError(err);
});
fetchAnimalData();
}, [debounce]);
const performSearch = async (text) => {
if (text.trim() === "") {
setResults([]);
}
setLoading(true);
setError(null);
setTimeout(() => {
fetchAnimalData(text)
.then((response2) => {
setResults(response2);
console.log(response2);
setLoading(false);
})
.catch((err) => {
setLoading(false);
setError(err);
});
}, 100);
};
return (
<SearchAnimalContext.Provider
value={{
results,
setResults,
searchAnimal,
setSearchAnimal,
input,
setInput,
performSearch,
loading,
error,
}}>
{children}
</SearchAnimalContext.Provider>
);
};
А вывод после поискового запроса console.log выглядит так:
category
:
30
category_name
:
"Katachtigen - Felidae"
Пока категория поиска отображается корректно: "Katachtigen - Felidae". Но после поиска категория отображается как 30 - category_id:, что не является правильным.
А функция поиска в компоненте выглядит так:
import React, { useContext, useEffect, useState } from "react";
import { SafeArea } from "../../../components/utility/safe-area.component";
import { SearchAnimalContext } from "../../../services/search-animal.context";
import { fetchSubCategoryData } from "../../../services/category/category.service";
export const SubCategoryScreen = ({ route, navigation }) => {
const [isLoading, setLoading] = useState(true);
const { performSearch, results, setInput, input } = useContext(SearchAnimalContext);
const [isSearchbarFocused, setSearchbarFocused] = useState(false);
useEffect(() => {
fetchSubCategoryData(route.params.subcategories).then((data) => {
setSubCategoryList(data.animals.length > 0 ? data.animals : data.subcategories);
setLoading(false);
});
}, [route]);
const handleSearchChange = (text) => {
setInput(text);
if (text.length === 0) {
performSearch("");
navigation.navigate("dieren");
} else {
performSearch(text);
}
};
return (
<SafeArea>
{isLoading && (
<LoadingContainer>
<ActivityIndicator animating={true} color={MD2Colors.green200} />
</LoadingContainer>
)}
<Searchbar
placeholder="Search animals"
value={input}
onFocus={() => setSearchbarFocused(true)}
onChangeText={handleSearchChange}
onBlur={() => setSearchbarFocused(false)}
style={styles.searchbar}
/>
</SafeArea>
);
};
А модель животного из бэкенда выглядит так:
import sys
from io import BytesIO
from django.db import models
class Animal(models.Model):
name = models.CharField(max_length=100, verbose_name="Naam")
sort = models.CharField(max_length=100, default='',
category = models.ForeignKey(
Category, related_name='animals', on_delete=models.CASCADE, verbose_name="Familie")
def category_name(self):
return self.category.name
class Meta:
verbose_name = "Dier"
verbose_name_plural = "Dieren"
# permissions = [("set_display_flag", "Check name is display or not",)]
super(Animal, self).save()
def __str__(self):
return self.name
Как отобразить правильное название категории, а не ее id после поискового запроса?