0

Это модели Django ORMДжанго сериализаторы: несколько таблиц OneToOne отношение к таблице

class A(models.Model): 
    ... 

class B(models.Model): 
    a = models.Foreignkey(A, on_delete=models.CASCADE) 

class C(models.Model): 
    a = models.Foreignkey(A, on_delete=models.CASCADE) 

А вот сериализаторы:

class ASerializer(serializers.ModelSerializer): 
    class Meta: 
     model = A 

class BSerializer(serializers.ModelSerializer): 
    a = ASerializer(many=False) 
    class Meta: 
     model = B 

class CSerializer(serializers.ModelSerializer): 
    a = ASerializer(many=False) 
    class Meta: 
     model = C 

B и C работают, как ожидалось.

Задача 1:

Теперь, если я хочу, чтобы получить данные B и C от сериализатора А, делая b = BSerializer(many=False) и c = CSerializer(many=False). Я получаю сообщение об ошибке NameError: name 'BSerializer' is not defined, и если я поставил сериализатор B и C над ошибками A для Aserializer. Как это исправить?

Задача 2:

B и C имеют отношение один к одному с А. Таким образом, при сериализации, он не может иметь последующий B или C или как данные в таблицах B и C. Так, в ASerializer

b = BSerializer(many=False) 
c = CSerializer(many=False) 

может дать ошибки, если нет соотношения между А и С для конкретной строки. Как это исправить?

ответ

0

Во-первых, я хотел бы предложить, что если вы собираетесь иметь one-to-one relationship, что вы на самом деле определить его таким образом:

class A(models.Model): 
    ... 

class B(models.Model): 
    a = models.OneToOneField(A, on_delete=models.CASCADE) 

class C(models.Model): 
    a = models.OneToOneField(A, on_delete=models.CASCADE) 

ПРОБЛЕМА ОДНА

Я не проверял этого, но может ли это быть вопросом определения определения? Что произойдет, если вы поместите определение class A после class B и class C?

ПРОБЛЕМА ВТОРАЯ

Попробуйте добавить required=False, allow_null=True как suggested here.

b = BSerializer(many=False, required=False, allow_null=True) 
c = CSerializer(many=False, required=False, allow_null=True) 
+0

Добавление определения А после того, как B и C будет по-прежнему давать ошибку, потому что В и С помощью А. –

+0

Хм, а вы могли бы попробовать что-то реальное Hacky, добавив еще один класс сериализатора в конце, что только подклассов : 'class HackyClassA (A): pass' –

Смежные вопросы