es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

DRF. Intentando crear un registro que requiere una instancia de otro objeto de base de datos, y sigo obteniendo el error “el argumento int() debe ser una cadena…”

Soy nuevo en Django y DRF y realmente estoy teniendo dificultades con algo.

Estoy intentando crear un registro en una tabla que tiene una clave externa. Diremos que los modelos se ven así:

class Foo(models.Model):
  foo_id = models.IntegerField(
    primary_key=True,
  )
  name = models.CharField(
    max_length=256,
  )

class Bar(models.Model):
  bar_id = models.CharField(
    primary_key=True,
    max_length=256
  )
  name = models.CharField(
    max_length=256,
  )
  foo = models.ForeignKey(
    Foo,
    models.SET_NULL,
    related_name='rel',
  )

Cuando intento esto:

Bar.objects.create(
  bar_id = "A1",
  name = "John",
  foo = 5
)

Recibo el error que esperaba:
“No se puede asignar “5”: “Bar.foo” debe ser una instancia de “Foo”.

Pero si intento esto:

Bar.objects.create(
  bar_id = "A1",
  name = "John",
  foo = Foo.objects.get(foo_id=7)
)

Recibo:
“argumento int() debe ser una cadena, un objeto similar a bytes o un número, no ‘Foo'”

Realmente no entiendo, ya que estoy seguro de haber creado registros de esta manera en otros lugares.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en el tipo de clave primaria del modelo Foo, que es un IntegerField. Cuando utilizas foo = 5, estás intentando asignar directamente un entero como clave externa al modelo Bar, pero Django requiere una instancia del modelo relacionado (Foo en este caso).

    En el segundo intento, estás intentando obtener una instancia de Foo utilizando Foo.objects.get() y asignándola a foo. Sin embargo, el error el argumento int() debe ser una cadena, un objeto similar a bytes o un número, no 'Foo' sugiere que el valor que se está pasando a foo no es una instancia de Foo, sino la clase de modelo Foo en sí.

    Para solucionar este problema, debes cambiar foo por una instancia de Foo:

    foo_instance = Foo.objects.get(foo_id=7)
    Bar.objects.create(
      bar_id="A1",
      name="John",
      foo=foo_instance
    )
    

    Esto debería crear una nueva instancia de Bar con la clave externa especificada a Foo.

Comments are closed.