【问题标题】:How to do a relationship using DRF to another table without foreignKey如何使用 DRF 与另一个没有外键的表建立关系
【发布时间】:2019-04-10 06:25:48
【问题描述】:

我不能在没有关系的两个表之间建立关系。

我的模型是:

class exampleModel(models.Model):
    quantity         = models.IntegerField(blank=False, null=True)
    comment          = models.CharField(max_length=100 , blank=True, null=True)
    class Meta:
        db_table = "example"
class Logger(models.Model):
    id_table = models.IntegerField() 
    table    = models.CharField(max_length=20 , blank=True, null=True) 
    comment  = models.CharField(max_length=100 , blank=True, null=True)  
    action   = models.CharField(max_length=100 , blank=True, null=True)
    date_created     = models.DateTimeField(auto_now_add=True)  
    class Meta:
        db_table = "logger"

我已经填写了记录器模型,但是,我无法创建exampleSerializer

我的序列化器是:

 class LoggerSerializer(serializers.ModelSerializer):
    class Meta:
       db_table = u'logger'
       model    = Logger
       fields   = '__all__'
class exampleSerializer(serializers.ModelSerializer):
    last_log = LoggerSerializer(read_only=True)
    class Meta:
        db_table = 'example'
        model = ExampleModel
        fields = ( 'id' , 'last_log' , 'quantity')

在记录器中保存:

id_table : 'primary key of example',
table : 'example'
comment : 'custom comment',
action : "CRUD"

【问题讨论】:

    标签: django python-3.x django-rest-framework


    【解决方案1】:

    您可以查询视图中的最后一个记录器,然后将其传递给上下文中的序列化程序。 然后执行以下操作:

    class exampleSerializer(serializers.ModelSerializer):
        last_log = serializers.SerializerMethodField()
    
        class Meta:
            db_table = 'example'
            model = ExampleModel
            fields = ('id', 'last_log', 'quantity')
    
        def get_last_log(self, obj):
            last_log = obj.state(self.context['last_log'])
            last_log_serializer = LoggerSerializer(last_log)
            return last_log_serializer.data
    

    你传递给上下文,类似于:

    exampleSerializer(queryset, context ={'last_log': last_log_object})
    

    您也可以在exampleSerializer中进行查询:

    class exampleSerializer(serializers.ModelSerializer):
        last_log = serializers.SerializerMethodField()
    
        class Meta:
            db_table = 'example'
            model = ExampleModel
            fields = ('id', 'last_log', 'quantity')
    
        def get_last_log(self, obj):
            logger_queryset =Logger.objects.filter(table = self.Meta.db_table, id_table = obj.id)
            return  LoggerSerializer(logger_queryset).data
    

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 2021-04-23
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多