Как получить объект из набора запросов другого списка объектов в Django - PullRequest
0 голосов
/ 23 апреля 2019

Я занимаюсь разработкой проекта с использованием django, и у меня возникла небольшая проблема.

Я пытаюсь получить массив из набора запросов другого объекта.Попытка получить «articulo», у которого есть поле «carro_det.id_articulo_fk», и после отправки его в контекст моего шаблона:

Но в querySet я получаю ошибку, аргумент int () должен бытьстрока, байтовоподобный объект или число, а не 'Articulo' '

Конкретно в строке: articulo[i]=Articulo.objects.get(pk=carro_det[i].id_articulo_fk)

Это из моих views.py:

def index(request, id_user):
    carro=Carro.objects.get(id_usuario_fk=id_user)
    carro_det=Carro_det.objects.filter(id_articulo_fk=carro.id)

    #HERE IS THE PROBLEM

    for i in range(len(carro_det)):
        articulo[i]=Articulo.objects.get(pk=carro_det[i].id_articulo_fk)
    contexto = {'articulo':articulo,
                'carro_det':carro_det}
    return render(request, 'cart/cart.html', contexto)

И это из моего файла models.py, как вы видите, здесь все хорошо:

class Carro(models.Model):

    total = models.FloatField(default=0, null=True, blank=True)
    #llaves foraneas
    id_usuario_fk=models.ForeignKey('myuser.Usuario', null=True, blank=True, on_delete=models.CASCADE, db_column='id_usuario_fk')


    def __str__(self):
        return "id_carro_cliente: " + str(self.id)

class Carro_det(models.Model):
    cantidad = models.IntegerField(default=0)
    precio_venta = models.FloatField(default=0)
    total = models.FloatField(default=0)
    #llaves foraneas
    id_carro_fk=models.ForeignKey('Carro', null=True, blank=True, on_delete=models.CASCADE, db_column='id_carro_fk')    
    id_articulo_fk=models.ForeignKey('article.Articulo', on_delete=models.CASCADE, db_column='id_articulo_fk')

    def __str__(self):
        return "numero de carro asociado: " + str(self.id_carro_fk.pk)

Я надеюсь, что кто-нибудь может помочь мне с этим, Спасибо!.

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

эти 2 атрибута:

id_carro_fk=models.ForeignKey('Carro', null=True, blank=True, on_delete=models.CASCADE, db_column='id_carro_fk')    
id_articulo_fk=models.ForeignKey('article.Articulo', on_delete=models.CASCADE, db_column='id_articulo_fk')

являются объектами, а не PK, даже если вы так их называли. Вы могли бы сделать:

articulo[i]=Articulo.objects.get(pk=carro_det[i].id_articulo_fk.pk)  # notice the .pk at the end

Но это не настоящая проблема здесь. Казалось бы, вам нужно более внимательно прочитать документы Django об отношениях. Похоже, что вы обращаетесь ко всем связанным Carro_det объектам к экземпляру Carro, выполнив эти 2 запроса, когда вы можете просто получить доступ к связанному атрибуту.

При объявлении поля ForeignKey в django вы обращаетесь к связанному объекту напрямую, при этом django создает поле id под обложками. Эти отношения могут быть доступны с другой (многих) сторон путем доступа:

RelatedModel.FKmodel_set

или, если указано так:

class Carro(Model):
    field = ForeignKey('Model', related_name='related_fields', ...)

, то:

# Carro_det instance
instance.related_fields  # this accesses all carros related to this carro_det
                         # but this is a queryset you can filter down further, it is fetched lazily

или в вашем случае:

carro_instance.carro_det_set

Вместо того, как вы это делаете ...

0 голосов
/ 23 апреля 2019

carro_det[i].id_articulo_fk возвращает экземпляр внешнего ключа (Articulo). Вместо этого вам нужно использовать id_articulo_fk_id, который является фактическим pk экземпляра Articulo.

Использование:

articulo[i]=Articulo.objects.get(pk=carro_det[i].id_articulo_fk_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...