我想在 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,请帮忙!!!
我尝试了不同的复合密钥库,但在迁移时出现错误
我的项目中也遇到同样的问题,我找到了这个解决方案。通过使用Meta类,你可以拥有pks的组合。您可以在下面的单元格中看到答案。
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'
)
]
您还可以在此链接上阅读有关元类的更多信息。我希望这对你有帮助。