【问题标题】:How Get data with join django Rest framework from other table如何使用 join django Rest 框架从其他表中获取数据
【发布时间】:2019-11-14 08:09:33
【问题描述】:

我有两个模型第一个是

class Event(models.Model):
    main_image = models.ImageField(upload_to='events/images', default="")
    event_name = models.CharField(max_length=100, default="")
    event_organizer = models.ForeignKey(
    Organizer, on_delete=models.CASCADE, limit_choices_to={'is_active': True})

另一个是

class additional_images(models.Model):
   # When a Event is deleted, upload models are also deleted
   event = models.ForeignKey(Event, on_delete=models.CASCADE)
   image = models.FileField(upload_to='events/images', null=True, blank=True, default="")

序列化器类由

给出
class eventSerializer(serializers.ModelSerializer):
    class Meta:
        model = Event
        fields = ['id', 'main_image', 'event_name', 'event_address', 'event_organizer']

我的问题是我如何通过eventSerializer 获得additional_images

【问题讨论】:

标签: django django-models django-rest-framework


【解决方案1】:

感谢熊布朗。他的评论很有帮助,我将其发布为答案 更新我的additional_images 模型

class additional_images(models.Model):

    event = models.ForeignKey(Event, on_delete=models.CASCADE, 
                             related_name="additional_images",
                             related_query_name="additional_image",)
   image = models.FileField(upload_to='events/images', null=True, blank=True, default="")

并为此制作序列化程序类

class additionalImagesSerializer(serializers.ModelSerializer):
    class Meta:
        model = additional_images
        fields = ['image']

eventSerializer 类中

class eventSerializer(serializers.ModelSerializer):
    additional_images = additionalImagesSerializer(many=True, read_only=True)
    class Meta:
        model = Event
        fields = ['additional_images', 'id', 'main_image', 'event_name', 
                  'event_address',  'event_organizer']

效果很好!

【讨论】:

  • 是否可以使用另一个序列化程序,如历史记录,我可以在其中加入事件和 addditional_image 和序列化程序并访问两个表字段如果可能的话,谁能解释一下
【解决方案2】:

您可以在文档中了解ForeignKey 以及如何访问它们之间的关系。

但是,你可以这样做:

1) (可选)指定相关名称:

class additional_images(models.Model):
   # When a Event is deleted, upload models are also deleted
   event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name="images")

2) 您现在可以使用event.images 访问它。所以你可以在你的序列化器中使用它:

class eventSerializer(serializers.ModelSerializer):
    class Meta:
        model = Event
        fields = ['id', 'main_image', 'event_name', 'event_address', 'event_organizer', 'images']

现在您将获得图像作为图像 ID 列表。如果您有图像序列化器,则可以在事件序列化器中指定嵌套序列化器。

代码审查评论:您有 3 个类,每个类都有不同的命名约定。坚持一个,最好 -> EventSerializer

【讨论】:

    【解决方案3】:
    class eventSerializer(serializers.ModelSerializer):
        image = serializers.CharField(source='additional_images.get_image_url', read_only=True)
        additional_images = serializers.PrimaryKeyRelatedField(queryset=additional_images.objects.all())
        class Meta:
        model = Event
        fields = ['id','main_image', 'event_address',  'event_organizer', 'additional_images', 'image']
    

    并在您的模型中定义获取图像 url 方法

    class additional_images(models.Model):
       .........
       def get_image_url(self):
           returen "%s,%s" %(settings.MEDIA_URL, self.image)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      相关资源
      最近更新 更多