代码之家  ›  专栏  ›  技术社区  ›  tomoc4

将Django模型链接在一起

  •  -1
  • tomoc4  · 技术社区  · 6 年前

    嗨,我有两个后台函数,从api获取数据,并每隔几秒钟更新一次模型 .save()

    像这样更新的模型是 MBEvent MBOrders

    我想用外键映射模型之间的数据。 event_id temp_id runner_id 是这三种模式的主键。

    runner_1_back_odds runner_2_back_odds runner_1_lay_odds runner_2_lay_odds MBEvent公司 作为 current_back_odds current_lay_odds MBBet

    我没能弄到外键在django工作。有没有可能是我要求的外键? 我真正想要的是,当MBEvent更新时,数据也在MBBet中更新。外键是否可以将模型映射到一起并确保数据的完整性?

    class MBEvent(models.Model):
         event_id = models.BigIntegerField(primary_key=True)
         event_name = models.CharField(max_length=100,null=True)
         start_time = models.DateTimeField(null=True)
         is_ip = models.CharField(max_length=100,null=True)
         runner_1_name = models.CharField(max_length=100,null=True)
         runner_2_name = models.CharField(max_length=100,null=True)
         runner_1_id = models.BigIntegerField(null=True)
         runner_2_id = models.BigIntegerField(null=True)
         runner_1_back_odds = models.FloatField(null=True)
         runner_2_back_odds = models.FloatField(null=True)
         runner_1_lay_odds = models.FloatField(null=True)
         runner_2_lay_odds = models.FloatField(null=True)
    
    class MBOrders(models.Model):
        temp_id = models.FloatField(primary_key=True)
        event_id = models.BigIntegerField(null=True)
        event_name = models.CharField(null=True,max_length=300)
        runner_name = models.CharField(null=True, max_length=100)
        runner_id = models.BigIntegerField(null=True)
        odds = models.FloatField(null=True)
        remaining = models.IntegerField(null=True)
        pot_pro = models.IntegerField(null= True)
        rem_pot_pro = models.IntegerField(null=True)
        pot_lib = models.IntegerField(null=True)
        side = models.CharField(null=True, max_length=8)
        stake = models.IntegerField(null=True)
        status = models.CharField(null=True, max_length=10)
        time_stamp = models.DateTimeField(null=True)
    
    
    class MBBet(models.Model):
        runner_id = models.BigIntegerField(primary_key=True)
        runner_name = models.ForigenKey(MBEvent,on_delete=MODELS.CASCADE)
        event_name = models.CharField(null=True,max_length=300)
        current_back_odds = models.ForigenKey(MBEvent,on_delete=MODELS.CASCADE)
        current_lay_odds =  models.ForigenKey(MBEvent,on_delete=MODELS.CASCADE)
        bet_odds = models.FloatField(null=True)
        side = models.CharField(null=True, max_length=8)
        stake = models.IntegerField(null=True)
        status = models.CharField(null=True, max_length=10)
        time_stamp = models.DateTimeField(null=True)
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Rémi Héneault    6 年前

    一旦在模型中设置了ForeignKey字段,就可以这样使用它们:

    mb_event_one = MBEvent()
    mb_event_two = MBEvent()
    
    mb_bet = MBBet()
    mb_bet.current_back_odds = mb_event_one
    mb_bet.current_lay_odds = mb_event_two
    
    mb_bet.save()
    

    mb_bet.current_back_odds.event_id  # == mb_event_one.event_id
    mb_bet.current_lay_odds.event_name  # == mb_event_two.event_name
    

    我建议你用清楚和准确的名字为你的外国关键领域。如果您链接了一个事件,那么最好调用您的字段 hosting_event 或者类似的。


    编辑: 好吧,我知道你想做什么了。

    ForeignKey字段用于链接 模型 一起,而不是田地。 你应该这样使用它们:

    class MBRunner(models.Model):
        # ...
    
    class MBEvent(models.Model):
        event_id = models.BigIntegerField(primary_key=True)
        runner = models.ForeignKey(MBRunner, on_delete=models.CASCADE)
    
    my_runner = MBRunner()
    my_event = MBEvent(runner=my_runner)
    

    这样您就可以从事件访问所有运行程序的属性。

    my_event.runner.runner_name  # == my_runner.runner_name
    

    documentation 再一次。