如何通过 Django 将特定用户数据显示到序列化程序中?

How can I show specific users data into the serializer through django?

我正在尝试为股票市场创建一个用户组合。 我有这样的自定义用户模型:

class CustomUsers(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True, db_index=True,null=True)
    phone_no = models.CharField(max_length=50,null=True,unique=True)
    first_name = models.CharField(max_length=120, blank=True)
    last_name = models.CharField(max_length=120, blank=True)
   
    is_admin = models.BooleanField('admin', default=False)
    
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'
        ),
    )
    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_(
            'Designates whether the user can log into this admin site.'
        ),
    )
    date_joined = models.DateTimeField(
        _('date joined'), default=timezone.now
    )
    objects = CustomUserManager()

    def get_full_name(self):
        return (self.first_name +" " +self.last_name)

我有另一个名为 portfolio 的应用,里面有两个模型。他们是这样的:

class MyShares(models.Model):

    TYPE = (
        ('IPO',_('IPO')),
        ('FPO', _('FPO')),
        ('Secondary',_('Secondary')),
        ('Bonus', _('Bonus')),
        ('Rights', _('Rights')),
        ('Auction', _('Auction'))

    )
    SHARE_STATUS = (
        ('Owned',_('Owned')),
        ('Sold',_('Sold'))
    )
    user = models.ForeignKey("users.CustomUser", verbose_name=_("User"), on_delete=models.CASCADE, related_name='my_shares')
    stock_symbol = models.ForeignKey("finance.Organization", verbose_name=_("Stock Symbol"), on_delete=models.CASCADE)
    buy_date = models.DateField(_("Buy Date"), auto_now=False, auto_now_add=False)
    sell_date = models.DateField(_("Sell Date"), auto_now=False, auto_now_add=False, null=True, blank=True)
    buy_price = models.FloatField(_("Buy Price"))
    sell_price = models.FloatField(_("Sell Price"),null=True,blank=True)
    quantity = models.PositiveIntegerField(_("Quantity"))
    share_type = models.CharField(_("Type"), choices=TYPE, default='IPO', max_length=50)
    share_status = models.CharField(_("Status"),choices=SHARE_STATUS,default='Owned', max_length=50)

    
    def __str__(self):
        # if self.user.first_name:
        #     return self.user.get_full_name()
        return self.stock_symbol.symbol
    
class Portfolio(models.Model):
    user = models.ForeignKey("users.CustomUser", verbose_name=_("User"), on_delete=models.CASCADE, related_name='portfolio')
    my_shares = models.ManyToManyField("portfolio.MyShares", verbose_name=_("Shares"))

    def __str__(self):
        if self.user.first_name:
            return self.user.get_full_name()
        return self.user.email

在这里,Organization 是另一个应用程序中的另一个模型,它跟踪股票市场上列出的当前组织。 我的投资组合序列化程序如下:


class MySharesSerializer(serializers.ModelSerializer):
    user = serializers.ReadOnlyField(source='user.get_full_name')
    class Meta:
        model = MyShares
        fields = (
            'user',
            'stock_symbol',
            'buy_date',
            'buy_price',
            'quantity',
            'sell_date',
            'sell_price',
            'share_type',
            'share_status'
        )

class PortfolioSerializer(serializers.ModelSerializer):
    my_shares = MySharesSerializer(many=True).data
    user = serializers.ReadOnlyField(source='user.get_full_name')
    class Meta:
        model = Portfolio
        fields = (
            'user',
            'my_shares'
        )

我希望输出是这样的:

"results": [
    {
      "user": "USER1",
      "my_shares": [
      {
      "user": "USER1",
      "stock_symbol": 801,
      "buy_date": "2021-03-10",
      "buy_price": 510,
      "quantity": 200,
      "sell_date": null,
      "sell_price": null,
      "share_type": "IPO",
      "share_status": "Owned"
      }
    ]
    }
  ]

相反,它显示输出为:

"results": [
    {
      "user": "USER1",
      "my_shares": []
    }
  ]

所以,我的问题是如何实现我想要的输出,有没有什么方法可以用投资组合的特定用户过滤 MySharesSerializer 数据?

您可以覆盖序列化程序中的 to_representation 方法

class PortfolioSerializer(serializers.ModelSerializer):
    
    user = serializers.ReadOnlyField(source='user.get_full_name')
    class Meta:
        model = Portfolio
        fields = (
            'user'
        )
    
    def to_representation(self, instance):
        data = super().to_representation(instance)
        data["my_shares"] = MySharesSerializer(instance.my_shares.all(), many=True).data
        return data