【问题标题】:django - use method on every object in queryset like filter '__in' custom managerdjango - 在查询集中的每个对象上使用方法,如过滤器'__in'自定义管理器
【发布时间】:2017-06-04 05:39:34
【问题描述】:

您好,我想实现玩家获取玩家列表(查询集)并离开战队的方法

我正在寻找类似的东西:

Player.leave_clan([1,2,3])
Player.leave_clan([p1,p2,p3])

我尝试的是获取 account_ids [1,2,3] 列表的方法,然后我在查询中使用更新的方法,但在这里我必须只传递帐户 ID

def remove_leavers(self, leavers, clan):
    players = Player.objects.filter(account_id__in=leavers)
    players.update(clan=None,
                   previous_clan=clan)

对于我目前的模型,我可以这样称呼:

leavers = Player.objects.filter(account_id__in=[1,2,3]
for player in leavers:
    player.leave_clan()

但我认为这不是正确的做法。我在下面使用以下模型,感谢您的所有建议和建议。 我想我需要自定义管理器,但即使在阅读文档后我也不知道如何编写它。

from django.db import models
class Clan(models.Model):
    clan_id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=100)
    tag = models.CharField(max_length=5)

    def __str__(self):
        return "{tag}".format(tag=self.tag)

    @property
    def members(self):
        return Player.objects.filter(clan=self)

    def kick_player(self, player):
        player.leave_clan()

class Player(models.Model):
    account_id = models.IntegerField(primary_key=True)
    account_name = models.CharField(max_length=250)


    clan = models.ForeignKey('Clan',
                               on_delete=models.CASCADE,
                               blank=True,
                               null=True,
                            related_name='current_clan')

    previous_clan = models.ForeignKey('Clan',
                               on_delete=models.CASCADE,
                               blank=True,
                               null=True,
                            related_name='previous_clan')


    def __str__(self):
        return '{0} - {1}'.format(self.account_name, self.account_id)

    def leave_clan(self):
        self.previous_clan = self.clan
        self.clan = None
        self.save()

【问题讨论】:

    标签: django django-queryset django-custom-manager


    【解决方案1】:

    如果你想使用管理器,你可以这样做:

    class PlayerManager(models.Manager):
        def leave_clan(self, players):
            """
            Take a list of player. And removed them from their clan
            """
            for player in players:
                player.leave_clan()
    
    
    class Player(models.Model):
        account_id = models.IntegerField(primary_key=True)
        account_name = models.CharField(max_length=250)
    
    
        clan = models.ForeignKey('Clan',
                                   on_delete=models.CASCADE,
                                   blank=True,
                                   null=True,
                                related_name='current_clan')
    
        previous_clan = models.ForeignKey('Clan',
                                   on_delete=models.CASCADE,
                                   blank=True,
                                   null=True,
                                related_name='previous_clan')
    
    
        def __str__(self):
            return '{0} - {1}'.format(self.account_name, self.account_id)
    
        def leave_clan(self):
            self.previous_clan = self.clan
            self.clan = None
            self.save()
    

    如何使用

    Player.objects.leave_clan(LIST_PLAYERS)
    

    希望对你有帮助。

    【讨论】:

    • 太棒了,这正是我想要的!
    猜你喜欢
    • 2015-12-30
    • 2011-08-14
    • 2010-10-14
    • 2016-09-11
    • 2016-11-24
    • 2017-11-07
    • 2021-04-18
    • 2021-01-27
    • 2018-01-20
    相关资源
    最近更新 更多