在Django中,如何编写一个查询来选择四个整数的所有可能的组合?

2024-04-29 01:53:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我在写一个游戏网站,抽签是由四位数组成的。e、 g 1234号

我试图用django编写一个查询,它将根据输入的四位数字选择所有获奖者。赢家是相同数字或相同组合的任意组合,1 2 3 4,2 3 1 4,4 1 3 2都是赢家。在

编写此查询的最有效方法是什么。在

-------------------此处没有提供样本供编辑

class Draw(models.Model):
    digit1 = models.PositiveSmallIntegerField(null=True,blank=True)
    digit2 = models.PositiveSmallIntegerField(null=True,blank=True)
    digit3 = models.PositiveSmallIntegerField(null=True,blank=True)
    digit4 = models.PositiveSmallIntegerField(null=True,blank=True)
    draw_date = models.DateTimeField()
    closed = models.BooleanField()
    winner = models.BooleanField()

    def __unicode__(self):
        return "Draw For Week Ending %s" %(self.draw_date)

    def get_absolute_url(self):
        return "/draw/%s/" % (self.draw_date)

    def save(self, force_insert=False, force_update=False):
        if self.digit1 and self.digit2 and self.digit3 and self.digit4:
            #check if there are winners
            try:
                winners = Ticket.objects.filter(draw=self.id,digit1=self.digit1,digit2=self.digit2,digit3=self.digit3,digit4=self.digit4)
                self.winner = True
            except Ticket.DoesNotExist:
                self.winner = False                
            #close & save draw/winners
            self.closed = True
            # Add new Draw for following week.
            new_date = self.draw_date + datetime.timedelta(hours=168)
            new_draw= Draw(draw_date=new_date)
            new_draw.save()
        super(Draw, self).save(force_insert, force_update) # Call the "real" save() method.

class Serial(models.Model):
    serial = models.CharField(max_length=4)
    closed = models.BooleanField(unique=False)

    def __unicode__(self):
        return "%s" %(self.serial)

    def get_absolute_url(self):
        return "/draw/serial/%s/" % (self.serial)    

class Ticket(models.Model):
    draw = models.ForeignKey(Draw)
    digit1 = models.PositiveSmallIntegerField()
    digit2 = models.PositiveSmallIntegerField()
    digit3 = models.PositiveSmallIntegerField()
    digit4 = models.PositiveSmallIntegerField()
    date = models.DateField(auto_now_add=True,editable=False)
    active = models.BooleanField(default=True)
    serial_used = models.ForeignKey(Serial,related_name="ticket_serial_used")

    def __unicode__(self):
        return "#: %s - %s" %(self.id,self.draw)

    def get_absolute_url(self):
        return "/ticket/%s/" % (self.id)    

    def save(self, force_insert=False, force_update=False):
        if self.serial_used:
            serial = Serial.objects.get(pk=self.serial_used.id)
            serial.closed = True
            serial.save()
        super(Ticket, self).save(force_insert, force_update) # Call the "real" save() method.

Tags: selffalsetruedatereturnmodelssavedef
3条回答

数字的顺序重要吗?在

如果没有,您可以按升序对票证和抽签的数字进行排序,然后使用您的代码

winners = Ticket.objects.filter(draw=self.id,digit1=self.digit1,digit2=self.digit2,digit3=self.digit3,digit4=self.digit4)

作为旁白,你的尝试。。。但是布洛克在没有赢家的情况下是不会理解的。DoesNotExist异常由get方法(see docs)引发。在

如果没有中奖彩票,filter方法将返回一个空的queryset,但不会引发错误。然后,您可以使用if语句检查是否有赢家。在

^{pr2}$

代码:

from itertools import permutations
winning_numbers = "1234"
winning_combinations = map(lambda v: "".join(v), list(permutations(winning_numbers, 4)))

winners = GamesPlayed.objects.filter(numbers__in=winning_combinations)

假设GamesPlayed是所有游戏的模型对象,其中包含四个选定数字的文本字段编号,格式为NNNN。在

如果您使用python2.5,itertools没有{}。这些文档有一个可以使用的实现:http://docs.python.org/library/itertools.html#itertools.permutations

我建议调整代码以保存数字,以便按排序顺序保存。E、 g.如果用户输入“5262”,则应将其存储为“2256”。然后,当您选择一组获胜的数字时,您可以对这些数字进行排序,并按简单的相等进行筛选。这将比尝试检查所有可能的组合要好得多。在

如果出于其他目的需要未排序的选择,请将新字段添加到模型sortedDigits或其他内容中,以便进行比较。在

相关问题 更多 >