Как создать объект Django с вложенными изображениями, используя django-rest-framework и Javascript - PullRequest
0 голосов
/ 31 августа 2018

Поэтому я пытаюсь загрузить несколько изображений с помощью JS / Paw (клиент, идентичный Postman) в конечную точку API Django, созданную django-rest-framework ("DRF"). Я посмотрел на все ответы по StackOverflow, но еще не нашел реализацию, которая работает для меня.

Пока, если я добавлю поле "ad" в мой запрос Paw multipart/form-data POST, оно просто не будет отображаться, когда я print() мой validated_data. Я пытаюсь найти способ отправить все свои данные через Paw / JS в DRF, чтобы он мог создать новый экземпляр Campaign, а также создать несколько объявлений и связать его с недавно созданной кампанией.

Любые предложения приветствуются.

views.py

class UserCampaignCreate(generics.CreateAPIView):
    serializer_class = serializers.UserCampaignSerializer
    queryset = models.Campaign.objects.all()
    parser_classes = (MultiPartParser, FormParser)

models.py

class Campaign(TimeStampedModel):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='campaignAsUser')
    title = models.CharField(max_length=55)
    slug = AutoSlugField(populate_from='title', unique=True, always_update=True)
    description = models.CharField(max_length=255, blank=True)
    location = models.ManyToManyField(Location, related_name='campaignAsLocation')
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()

    uuid = models.UUIDField(default=uuid.uuid4, editable=False)

    def __str__(self):
        return '{0}'.format(self.title)


class Ad(TimeStampedModel):
    title = models.CharField(max_length=55, blank=False)
    image = models.ImageField(upload_to=PathAndUniqueFilename('ad-placement-image/'))
    campaign = models.ForeignKey(Campaign, on_delete=models.CASCADE, related_name='adAsCampaign')

    uuid = models.UUIDField(default=uuid.uuid4, editable=False)

    def __str__(self):
        return '{0}'.format(self.title)

serializers.py

class UserCampaignSerializer(serializers.ModelSerializer):
    location = LocationSerializer(many=True)

    class Meta:
        fields = (
            'user',
            'location',
            'title',
            'description',
            'start_date',
            'end_date'
        )
        model = models.Campaign

    # NOTE: To create MANY-TO-MANY and associate :: https://stackoverflow.com/questions/40143267/updating-an-manytomany-field-with-django-rest
    def create(self, validated_data):
        for k, v in validated_data.items():
            print(k, ":", v)

        validated_locations = validated_data.pop('location')
        campaign = models.Campaign.objects.create(**validated_data)

        for location in validated_locations:
            location_id = location.pop('id', '')
            loc = models.Location.objects.filter(id=location_id)
            campaign.location.set(loc)

        return campaign
...