Я хочу получить URL изображения внешнего ключа проекта в таблице категорий проекта.

Models.py :

class ProjectCategory(MPTTModel):
      name = models.CharField(max_length = 100)
      slug = models.SlugField()
      banner = models.ImageField(upload_to='Project_banner', default = 'demo/demo.png')
      first_image = models.ForeignKey('ProjectImage',on_delete=models.SET_NULL,null=True)
      parent = TreeForeignKey('self',blank=True, null=True, related_name='children',   on_delete=models.CASCADE, db_index = True)

class ProjectImage(models.Model):
      title = models.CharField(max_length = 100)
      image = models.ImageField(upload_to='projectimage', default = 'demo/demo.png')
      watermark_thumb = models.ImageField(upload_to='thumbs', blank=True, null=True)
      thumbnail = models.ImageField(upload_to='thumbs', blank=True, null=True)
      category = models.ForeignKey('ProjectCategory', null=True, blank=True, on_delete=models.CASCADE,)
      description = models.TextField(max_length=1000)
      created_at = models.DateTimeField(default=now, editable=True)

      def __str__(self):
          return self.title

Serializers.py :

 class ProjectCategorySerializer(serializers.ModelSerializer):
       children = ProjectSubCategroySerializer(many=True, required=False)

       class Meta:
            model = ProjectCategory
            fields = ('id','name','slug','banner','first_image','parent','children')

       def get_fields(self):
           fields = super().get_fields()
           fields['children'] = ProjectCategorySerializer(many=True, read_only=True)
           return fields

Views.py :

class ProjectCategoryView(generics.ListCreateAPIView):
      authentication_classes = []
      permission_classes = []
      pagination_class = None
      queryset = ProjectCategory.objects.filter(parent__isnull=True).order_by('id')
      serializer_class = ProjectCategorySerializer

Urls.py :

    path('projectcategories/',views.ProjectCategoryView.as_view()),

.................................................. ...........

-1
afk 6 Фев 2020 в 09:27

2 ответа

Лучший ответ

Я не уверен, что правильно понял. Если вы хотите, чтобы URL-адрес first_image содержался в вашем ответе json, выполните следующие действия в ProjectCategorySerializer:

class ProjectCategorySerializer(serializers.ModelSerializer):
    children = ProjectSubCategroySerializer(many=True, required=False)
    photo = serializers.SerializerMethodField()

    class Meta:
        model = ProjectCategory
        fields = ('id','name','slug','banner','first_image','parent','children', 'photo')

    def get_fields(self):
        fields = super().get_fields()
        fields['children'] = ProjectCategorySerializer(many=True, read_only=True)
        return fields

    @staticmethod
    def get_photo(project_category):
        return project_category.first_image.image.url

Дайте мне знать, если это то, что вам нужно.

1
George Bikas 6 Фев 2020 в 08:44

В вашем файле models.py вызовите url из ImageField:

def get_url(self):
    return self.image.url

Со стороны вы можете получить это по pk:

item = ProjectImage.objects.get(pk=pk)
filename = item.image.url

Или по внешнему ключу, то есть по ProjectCategory pk:

item = ProjectCategory.objects.prefetch_related('projectimage_set').filter(pk=pk)
filename = item.image.url
0
Zaven Zareyan 6 Фев 2020 в 06:40