получить объект внешнего ключа django drf - PullRequest
0 голосов
/ 06 февраля 2020

Я хочу получить 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()),

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

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Я не уверен, что правильно понял. Если вы хотите, чтобы 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

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

0 голосов
/ 06 февраля 2020

В вашем файле 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
...