Size: a a a

Django [ru] #STAY HOME

2019 October 29

MK

Maxim Karganov in Django [ru] #STAY HOME
Но меня устроит любая структура, которая создаст/запишет в бд категории + n-вложенных подкатегорий и потом сможет восстановить структуру в GET-запросе
источник

MK

Maxim Karganov in Django [ru] #STAY HOME
Совсем на бедность - как хотя бы обработать вложенные подкатегории
источник

MK

Maxim Karganov in Django [ru] #STAY HOME
Сейчас у меня в сериализаторе children = ForeignKey, и ему не нравятся листы.
Выдаёт, что ожидался идентификатор, а получен list, и он не в восторге.
источник

T

Tim in Django [ru] #STAY HOME
Maxim Karganov
Идейно - в children после обработки записывать id-шники имён объектов подкатегории, если они были
я не понимаю походу чего-то. как до обработки понять, что это подкатегория?
Мне кажется лучше сделать две модели Категория и Подкатегория.
Подкатегория будет ссылаться на Категорию.

пишешь сериалайзер для Подкатегории SubcategorySerializer.
Пишешь сериалайзер для Категории CategorySerializer. В нем указываешь serializersMethodField() children. Через метод get_children достаешь все подкатегории для текущей категориии SubcategorySerializer(obj, many=True)
источник

T

Tim in Django [ru] #STAY HOME
погугли serializersMethodField
источник

MK

Maxim Karganov in Django [ru] #STAY HOME
Tim
я не понимаю походу чего-то. как до обработки понять, что это подкатегория?
Мне кажется лучше сделать две модели Категория и Подкатегория.
Подкатегория будет ссылаться на Категорию.

пишешь сериалайзер для Подкатегории SubcategorySerializer.
Пишешь сериалайзер для Категории CategorySerializer. В нем указываешь serializersMethodField() children. Через метод get_children достаешь все подкатегории для текущей категориии SubcategorySerializer(obj, many=True)
Да, я находил решение через подкатегории, но не понял, зачем они, и что мне их полем потом делать в бд
источник

T

Tim in Django [ru] #STAY HOME
то, что я написал - это на чтение только, на запись другой сериалайзер нужен
источник

T

Tim in Django [ru] #STAY HOME
Maxim Karganov
Сейчас у меня в сериализаторе children = ForeignKey, и ему не нравятся листы.
Выдаёт, что ожидался идентификатор, а получен list, и он не в восторге.
это очевидно)
источник

T

Tim in Django [ru] #STAY HOME
чтобы записать лист нужно свой create писать для serializer
источник

MK

Maxim Karganov in Django [ru] #STAY HOME
class CategoryDetailSerializer(serializers.ModelSerializer):
   class Meta:
       model = Category
       fields = ('name', 'children')

   def create(self, validated_data):
       childrens_data = validated_data.pop('children')
       new_category = Category.object.create(**validated_data)
       for children_data in childrens_data:
           Category.objects.create(new_category=new_category, **children_data)
       return new_category

"""
   def get_fields(self):
       fields = super(CategoryDetailSerializer, self).get_fields()
       fields['children'] = CategoryDetailSerializer(many=True)
       return fields
"""
источник

T

Tim in Django [ru] #STAY HOME
что такое children?
источник

MK

Maxim Karganov in Django [ru] #STAY HOME
Эт сериализоторы. Get_gields закомментил пока
источник

MK

Maxim Karganov in Django [ru] #STAY HOME
class Category(models.Model):
   name = models.CharField(verbose_name='name', db_index=True, unique=True, max_length=64)
   children = models.ForeignKey('self', blank=True, null=True, on_delete=models.CASCADE)
источник

T

Tim in Django [ru] #STAY HOME
покажи модель лучше
источник

MK

Maxim Karganov in Django [ru] #STAY HOME
Вот модель ^
источник

MK

Maxim Karganov in Django [ru] #STAY HOME
Съесть надо что-то такое, полученное в POSTe.

{
"name": "Category 1" ,
"children": [
{
"name": "Category 1.1" ,
"children": [
{
"name": "Category 1.1.1" ,
"children": [
{
"name": "Category 1.1.1.1"
},
{
"name": "Category 1.1.1.2"
},...etc
источник

T

Tim in Django [ru] #STAY HOME
Category.objects.create(new_category - у тебя же нет такого поля
источник

T

Tim in Django [ru] #STAY HOME
Maxim Karganov
class CategoryDetailSerializer(serializers.ModelSerializer):
   class Meta:
       model = Category
       fields = ('name', 'children')

   def create(self, validated_data):
       childrens_data = validated_data.pop('children')
       new_category = Category.object.create(**validated_data)
       for children_data in childrens_data:
           Category.objects.create(new_category=new_category, **children_data)
       return new_category

"""
   def get_fields(self):
       fields = super(CategoryDetailSerializer, self).get_fields()
       fields['children'] = CategoryDetailSerializer(many=True)
       return fields
"""
тут нужен рекурсивный процесс, такой цикл только поверх пройдет
источник

MK

Maxim Karganov in Django [ru] #STAY HOME
Ну вот я и пытался сделать через for children_data in childrens_data
источник

T

Tim in Django [ru] #STAY HOME
Maxim Karganov
Ну вот я и пытался сделать через for children_data in childrens_data
делай через рекурсию
источник