2014-10-08 15 views
5

Wie gehe ich über die Wiederverwendung des referenzierten Objekts, wenn verschachtelte Serializer in der DRF mit:Wiederverwendung von existierenden Objekt in Django Ruhe Framework-Nested Serializer

Lassen Sie uns sagen, ich habe die folgenden zwei Model s:

class Address(models.Model): 
    address_line = models.CharField(max_length=45) 

class Person(models.Model): 
    name = models.CharField(max_length=45) 
    address = models.ForeignKey(Address) 

mit Serializer s:

class AddressSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Address 

class PersonSerializer(serializers.ModelSerializer): 
    address = AddressSerializer() 

    class Meta: 
     model = Person 

Im Moment der Serializer Griff zu schaffen sowohl die Address und die Person zusammen. z.B. wenn ich poste die folgenden:

{ 
    'name': 'Alex', 
    'address': { 
     'address_line': "1 Here" 
    } 
} 

ein Person erstellt und ein Address mit dem Person auf die neu Address erstellt zeigt erstellt.

Was ist der beste Weg, um nicht ein neues Address zu schaffen, sondern eine bestehendes Address wieder zu verwenden, wenn es bereits ein Address mit einer bestimmten address_line? wenn ich das address_line Feld unique machen wollte? (Dieses Objekt Wiederverwendung wird manchmal als „Internierung“ genannt)

Was ist, wenn gab es zwei Adressfelder address_line1 und address_line2 und ich wollte das Address Objekt wieder zu verwenden, wenn es bereits ein Address mit diesen beiden Feldern besteht (dh unique_together=(address_line1, address_line2))

+1

Ich habe Dasselbe Problem. Hast du eine Lösung gefunden? –

Antwort

0

Kürzlich stand ich ein ähnliches Problem, löste es die folgenden Ansatz (der Code getestet, um seine gerade als Referenz wurde nicht):

class PersonSerializer(serializers.ModelSerializer): 
    address = AddressSerializer() 

    class Meta: 
     model = Person 

    def create(self, validated_data): 
     # pop the validated user data 
     # assuming its a required field, 
     # it will always be there in validated_data 
     address = validated_data.pop('address') 

     try: 
      address = Address.objects.get(address_line=address.get('address_line')) 
     except ObjectDoesNotExist: 
      address_serializer = AddressSerializer(data=address) 
      address_serializer.is_valid(raise_exception=True) 
      address = address_serializer.save() 
     else: 
      # save the user and update the validated_data for setting up profile 
      validated_data['address'] = address 

     return super(PersonSerializer, self).create(validated_data) 

this helps :)

Verwandte Themen