简体   繁体   English

如何在Django模型中访问外键值?

[英]How to access foreign key value in a django model?

I'm trying to build a simple Queue app, where a user can take a ticket with a number in a queue of a certain room. 我正在尝试构建一个简单的“队列”应用程序,在该应用程序中,用户可以在某个房间的队列中用数字取票。

I'm facing some problems defining the relationship between Ticket.number and Room.next_number_to_take. 我在定义Ticket.number和Room.next_number_to_take之间的关系时遇到了一些问题。 The value of Ticket.number on the tickets creation should be the Room.next_number_to_take however, I don't know how to define it in "Django" language without a specified init function for the class. 创建票证时,Ticket.number的值应为Room.next_number_to_take,但是,如果不为该类指定初始化函数,我不知道如何用“ Django”语言定义它。

Here is my failed attempt (its failing on the save method of the ticket): 这是我失败的尝试(失败了故障单的save方法):

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User


# Create your models here.
class Room(models.Model):
    name = models.CharField(max_length=100)
    room_master = models.ForeignKey(User, on_delete=models.CASCADE)
    current_visitor_number = models.BigIntegerField(default=0)
    next_number_to_take = models.BigIntegerField(default=0)

class Ticket(models.Model):
    request_date = models.DateTimeField(default=timezone.now)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    room = models.ForeignKey(Room, on_delete=models.CASCADE)
    number = models.BigIntegerField(default=0)

    def save(self, *args, **kwargs):
        self.number = self.room.next_number_to_take
        self.room.next_number_to_take += 1
        super(Ticket, self).save(*args, **kwargs)

I have previously tried the following which also failed: 我以前尝试过以下同样失败的方法:

class Ticket(models.Model):
    request_date = models.DateTimeField(default=timezone.now)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    room = models.ForeignKey(Room, on_delete=models.CASCADE)
    number = room.next_number_to_take
    room.next_number_to_take += 1

I haven't tried this code myself. 我自己还没有尝试过此代码。 I think that when you change the next_number for the Room model, that model isn't saved. 我认为,当您更改“ Room模型的next_number ,不会保存该模型。 So I have added another line to it. 所以我添加了另一行。 See if it works and get back to me with the error if you have any. 看看它是否有效,如果有任何错误,请尽快与我联系。

def save(self, *args, **kwargs):
    self.number = self.room.next_number_to_take
    self.room.next_number_to_take += 1 # this line is ok but you need to save it
    self.room.save() # this is the new line to add
    super(Ticket, self).save(*args, **kwargs)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM