django queryset注释子表中的所有字段

django queryset注释子表中的所有字段,django,django-models,django-rest-framework,django-queryset,Django,Django Models,Django Rest Framework,Django Queryset,models.py class Userinfo(models.Model): useruid = models.BigAutoField(db_column='UserUID', primary_key=True) useremail = models.CharField( db_column='UserEmail', unique=True, max_length=100) userpassword = models.CharField(db_colum

models.py

class Userinfo(models.Model):

    useruid = models.BigAutoField(db_column='UserUID', primary_key=True)

    useremail = models.CharField(
    db_column='UserEmail', unique=True, max_length=100)

    userpassword = models.CharField(db_column='UserPassword', max_length=128)

    passwordsalt = models.CharField(db_column='PasswordSalt', max_length=128)

    class Meta:
    managed = False
    db_table = 'userinfo'

class Postinfo(models.Model):


    postuid = models.BigAutoField(db_column='PostUID',primary_key=True)

    useruid = models.ForeignKey(
    'Userinfo', db_column='UserUID', on_delete=models.CASCADE)


    content = models.TextField(db_column='Content')

    class Meta:
          managed = False
          db_table = 'postinfo'
如果我得到用户列表和用户的最后一篇文章

我认为使用注释

models.Userinfo.objects.all().annotate(lastpost="??").order_by("-useruid")
什么是价值观

喜欢这个表格吗

[{userinfo1,"lastpost":{postinfofields}},{userinfo2,"lastpost":{postinfofields}},{userinfo3,"lastpost":{postinfofields}}]
我可以不使用forloop查询吗

序列化程序.py

class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Postinfo
        fields = ('postuid','content') 

class UserSerializer(serializers.ModelSerializer):   

     lastpost = PostSerializer() 

     class Meta:
        model = Userinfo
        fields = ['useruid', 'useremail', 'lastpost']
view.py

  userinfos = models.Userinfo.objects.all().order_by("-useruid")
  result = UserSerializer(userinfos,many=True)
  print(result.data)
引发异常

Got AttributeError when attempting to get a value for field `lastpost` on serializer `UserSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Userinfo` instance.
Original exception text was: 'Userinfo' object has no attribute 'lastpost'.
如果我添加read_only=True,请打印此

[OrderedDict([('useuid', 1), ('useremail', 'test')]), OrderedDict([('useruid', 2), ('useremail', 'test2')])]

您可以将模型的属性用于:

class Userinfo(models.Model):

    useruid = models.BigAutoField(db_column='UserUID', primary_key=True)

    useremail = models.CharField(
    db_column='UserEmail', unique=True, max_length=100)

    userpassword = models.CharField(db_column='UserPassword', max_length=128)

    passwordsalt = models.CharField(db_column='PasswordSalt', max_length=128)

    @property
    def lastpost(self):
        return self.postinfo_set.latest('postuid')
现在您不需要注释,只需在模板中使用注释,如下所示:

{{ user.lastpost.content }}
UPD

要使用ModelSerializer序列化属性,只需添加序列化程序的字段“lastpost”:

UPD2

您还可以直接在序列化程序级别实现逻辑,而不需要模型的属性。只需使用:


我必须返回dict,我可以生成dict吗?@Adam尝试使用序列化程序。我不明白我没有。。。class serializerserializers.ModelSerializer:class Meta:model=models.Userinfo fields='\uuuuu all\uuuuuu'@property def lastpostself:return json.loadsserializers.serializejson,self.postinfo\u set.order\u by'-PositId'[:1][0]这是对的吗?是的,我使用了drf,我非常感谢你所做的一切。永远拥有美好的未来luck@Adam我添加了带有DRF序列化程序的示例。
class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Postinfo
        fields = ('postuid','content') 

class UserSerializer(serializers.ModelSerializer):   
    lastpost = PostSerializer() 

    class Meta:
        model = Userinfo
        fields = ['useruid', 'useremail', 'lastpost']
class UserSerializer(serializers.ModelSerializer):   
    lastpost = SerializerMethodField() 

    class Meta:
        model = Userinfo
        fields = ['useruid', 'useremail', 'lastpost']

    def get_lastpos(self, obj):
        last = obj.postinfo_set.latest('postuid')
        serializer = PostSerializer(last)
        return serializer.data