postgresql 如何在django中使用复合主键?

v9tzhpje  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(1)|浏览(130)

我想在django中使用复合主键,但我找不到解决方案,我尝试了不同的方法,甚至试图在表中进行更改,但它不允许我,我想基于这个模型使用它

class Contiene(models.Model):
    id_boleto = models.OneToOneField("Boleto", primary_key=True, on_delete=models.CASCADE)
    boleto_cdg = models.CharField(default='', max_length=50)  # Asegúrate de que este campo sea opcional
    num_orden = models.ForeignKey("OrdenCompra", on_delete=models.CASCADE)
    cantidad_total = models.IntegerField()

    def generate_random_code(self):
        numbers = ''.join(random.choices(string.digits, k=12))  # Genera 12 números aleatorios
        letters = ''.join(random.choices(string.ascii_uppercase, k=3))  # Genera 3 letras aleatorias
        return numbers + letters

    def save(self, *args, **kwargs):
        # Si no se ha proporcionado un boleto_cdg, entonces genera uno automáticamente
        if not self.boleto_cdg:
            self.boleto_cdg = self.generate_random_code()
        
        # Llamar al método save de la superclase para guardar el objeto
        super(Contiene, self).save(*args, **kwargs)

    def __str__(self):
        return f"{self.id_boleto}{self.num_orden}{self.cantidad_total}{self.boleto_cdg}"`

字符串
num_orden和id_boleto会合成pk,请帮忙!
我尝试了不同的复合密钥库,但迁移时出错

guz6ccqo

guz6ccqo1#

我在我的项目中遇到了同样的问题,并找到了这个解决方案。通过使用Meta class,您可以拥有pk的组合。您可以在下面的单元格中看到答案。我希望这对您有帮助。

class Contiene(models.Model):
    id_boleto = models.OneToOneField("Boleto", primary_key=True, on_delete=models.CASCADE)
    boleto_cdg = models.CharField(default='', max_length=50)  # Asegúrate de que este campo sea opcional
    num_orden = models.ForeignKey("OrdenCompra", on_delete=models.CASCADE)
    cantidad_total = models.IntegerField()
    
     class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=['id_boleto', 'num_orden'], name='combination_pks'
            )
        ]

字符串
你也可以在这里阅读更多关于Meta类的内容。我希望这对你有帮助。

相关问题