2017-11-01 2 views
1

Ich versuche, ein neues Objekt mit einem Fremdschlüssel mit Django ListCreateAPIView erstellen. Der Verweis auf den Fremdschlüssel befindet sich in der URL. Ich habe versucht, lookup_url_kwarg verwenden, aber wenn ich eine json senden, erfordert es mich noch an den Eingang einer InstitutionDjango REST ListCreateAPIView Fremdschlüssel

views.py

class MemorandumCreateView(ListCreateAPIView): 
    # permission_classes = (IsAuthenticated,) 
    queryset = Memorandum.objects.all() 
    lookup_fields = 'institution_id' 
    lookup_url_kwarg = 'institution_id' 
    serializer_class = MemorandumSerializer 


    def get_queryset(self): 
     institution = self.lookup_url_kwarg['institution_id'] 
     return Memorandum.objects.filter(institution=institution) 

serializers.py

class MemorandumSerializer(ModelSerializer): 
    # lookup_fields = 'institution_id' 
    class Meta: 
     model = Memorandum 
     fields = "__all__" 

Urls. py

url(r'^(?P<institution_id>(\d+))/memorandums', MemorandumCreateView.as_view()), 

models.py

class Memorandum(Model): 
    MEMORANDUM_CATEGORIES = (
     ('MOA', 'Memorandum of Agreement'), 
     ('MOU', 'Memorandum of Understanding') 
    ) 
    AGREEMENT_TYPES = (
     ('B', 'Bilateral'), 
     ('M', 'Multilateral') 
    ) 

    institution = ForeignKey(Institution) 
    agreement = CharField(max_length=12, choices=AGREEMENT_TYPES) 
    memorandum_category = CharField(max_length=3, choices=MEMORANDUM_CATEGORIES) 
    memorandum_file = CharField(max_length=512) 
    version_date = DateField() 
    date_effective = DateField() 
    date_expiration = DateField(null=True) 
    college_initiator = CharField(max_length=5, choices=COLLEGES, null=True) 

Antwort

1

lookup_field nicht lookup_fields. Sobald dies eingestellt ist, verwendet der lookup_field_kwarg standardmäßig denselben.

In Ihrem Modell:

institution = ForeignKey(Institution) den null=True Parameter haben muss, wenn Sie eine Vereinbarung zu erstellen, ohne eine zugeordnete Institution in der Lage sein wollen. Ich glaube, der ModelSerializer wird diese Änderung übernehmen und allow_null=True auf dem PrimaryKeyRelatedField festlegen, das es für Sie erstellt.

http://www.django-rest-framework.org/api-guide/fields/#core-arguments

2

Sie können die institution_id von Ihrer URL packen, es dann in einem benutzerdefinierten verwenden perform_create:

class MemorandumCreateView(ListCreateAPIView): 
    ... 
    def perform_create(self, serializer): 
     institution = Institution.objects.get(id = self.kwargs['institution_id']) 
     serializer.save(institution = institution) 
+0

, wenn ich eine json ohne ‚Institution‘ Feld schicken, gibt es mir einen Serializer Fehler. Sollte es nicht die Daten von der URL extrahieren? – Jason

+0

Können Sie den Text des Fehlers teilen, den Sie erhalten? – souldeux

+0

Ich habe es durch Hinzufügen eines Ausschlusses im Serialisierer behoben danke! – Jason

Verwandte Themen