0

Dies ist Django ORM-ModelleDjango Serializer: mehrere Tabellen OneToOne Bezug auf eine Tabelle

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) 

Und hier sind die Serializer:

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 und C arbeiten wie erwartet.

Problem 1:

Nun, wenn ich will von b = BSerializer(many=False) und c = CSerializer(many=False) Daten von B und C aus Serializer A zu tun bekommen. Ich bekomme einen Fehler, NameError: name 'BSerializer' is not defined und wenn ich B und C Serializer über A-Fehler für Aserializer setzen. Wie behebe ich das?

Problem 2:

B und C haben eine Eins-zu-Eins-Beziehung mit A. Wenn also ein Serialisieren, könnte es nicht ein nachfolgendes B oder C oder sowohl Daten in Tabellen B und C haben. Also, in ASerializer

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

möglicherweise Fehler geben, wenn es keine Beziehung zwischen A und C für eine bestimmte Zeile ist. Wie behebe ich das?

Antwort

0

Zuerst würde ich vorschlagen, wenn Sie eine one-to-one relationship zu haben beabsichtigen, dass Sie es tatsächlich definieren auf diese Weise:

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) 

PROBLEM ONE

Ich habe dies noch nicht getestet, aber Könnte es sich um ein definitorisches Orderproblem handeln? Was passiert, wenn Sie die Definition class A nach class B und class C platzieren?

PROBLEM ZWEI

Try required=False, allow_null=True als suggested here hinzufügen.

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

Hinzufügen Definition von A nach B und C würde immer noch den Fehler geben, weil B und C A. mit –

+0

Hmm, gut Sie etwas Wirkliches Hacky versuchen könnten, durch eine andere Serializer Klasse am Ende hinzufügen, die nur eine Unterklasse : 'Klasse HackyClassA (A): pass ' –

Verwandte Themen