簡體   English   中英

Django 僅使用 Model1 的一列作為第二個模型中的外鍵

[英]Django use only one column of Model1 as a foreign key in second model

我有兩個 Django 模型(事件和 GMSEvents)。

我想使用事件模型的 eventAcronym 作為 GMSEvents 中的外鍵。 我嘗試如下,但我收到錯誤

AssertionError: ForeignKey(<django.db.models.query_utils.DeferredAttribute object at 0x000002032DA1E8C8>) is invalid. First parameter to ForeignKey must be either a model,
 a model name, or the string 'self'

楷模

class Events(models.Model):
    eventAcronym = models.CharField(max_length=4, blank=False, null=False)
    eventName = models.CharField(max_length=30, blank=False, null=False)

    def __str__(self):
        return f"{self.eventAcronym} - {self.eventName}"


class GMSEvents(models.Model):
    gateNo = models.IntegerField(blank=False, null=False)
    aircraftName = models.CharField(max_length=15, blank=False, null=False)
    detectEvent = models.ForeignKey(Events.eventAcronym, on_delete=models.CASCADE)
    timeStamp = models.DateTimeField()

更新: 在此處輸入圖片說明

您應該將eventAcronym標記為unique ,否則它本身並不指代唯一元素:

class Events(models.Model):
    eventAcronym = models.CharField(max_length=4, unique=True)
    # …

那么你可以使用to_field=…參數 [Django-doc]來指定目標列:

class GMSEvents(models.Model):
    gateNo = models.IntegerField()
    aircraftName = models.CharField(max_length=15)
    detectEvent = models.ForeignKey(
        Events, to_field='eventAcronym',
        on_delete=models.CASCADE
    )
    timeStamp = models.DateTimeField()

嘗試將primary_key=True添加到 eventAcronym 字段。 detectEvent = models.ForeignKey(Events, on_delete=models.CASCADE)

 class Events(models.Model):
        eventAcronym = models.CharField(max_length=4, primary_key=True)
        eventName = models.CharField(max_length=30, blank=False, null=False)
    
        def __str__(self):
            return f"{self.eventAcronym} - {self.eventName}"

    class GMSEvents(models.Model):
    gateNo = models.IntegerField(blank=False, null=False)
    aircraftName = models.CharField(max_length=15, blank=False, null=False)
    detectEvent = models.ForeignKey(Events, on_delete=models.CASCADE)
    timeStamp = models.DateTimeField()

ForeignKey字段的第一個參數應該是您想要關聯的模型類,而不是特定字段(即Events而不是Events.eventAcronym )。 Django 會自動使用該模型的主鍵作為外鍵列:

class Events(models.Model):
    # add `primary_key=True` here if you don't want to use the implicit ID field
    eventAcronym = models.CharField(max_length=4, blank=False, null=False)
    eventName = models.CharField(max_length=30, blank=False, null=False)


class GMSEvents(models.Model):
    gateNo = models.IntegerField(blank=False, null=False)
    aircraftName = models.CharField(max_length=15, blank=False, null=False)
    detectEvent = models.ForeignKey(Events, on_delete=models.CASCADE)
    timeStamp = models.DateTimeField()

如需參考,請參閱https://docs.djangoproject.com/en/3.1/ref/models/fields/#django.db.models.ForeignKey

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM