MongoDB embedded and array fields in django

704 views Asked by At

I have a question about querying embedded and array fields in django.

This is my models.py file:

from djongo import models

class detalji_igrica(models.Model):
    pegi_rejting = models.IntegerField()
    izdavac = models.CharField(max_length=64)
    zanr = models.CharField(max_length=32)
    datum_izlaska = models.CharField(max_length=32)

    class Meta:
        abstract = True

class komentari(models.Model):
    id_korisnika = models.IntegerField()
    komentar_naslov = models.CharField(max_length=64)
    komentar = models.TextField()
    datum_komentara = models.CharField(max_length=32)
    rejting_korisnika = models.FloatField()

    class Meta:
        abstract = True

class Igrica(models.Model):
    sifra_artikla = models.IntegerField()
    naziv = models.CharField(max_length=32)
    cena = models.FloatField()
    konzola = models.CharField(max_length=32)
    slika = models.CharField(max_length=64)
    opis = models.TextField()
    rejting = models.FloatField()
    vrsta = models.CharField(max_length=32)
    detalji_igrica = models.EmbeddedField(
        model_container = detalji_igrica
    )
    komentari = models.ArrayField(
        model_container = komentari
    )

Here is my views.py file:

@api_view(['GET'])
def najjeftinije_prvo(request):
    igrice = Igrica.objects.get(detalji_igrica__pegi_rejting = 18)
    if request.method == 'GET':
        igrica_serializer = IgricaSerializer(igrice, many=True)
        return JsonResponse(igrica_serializer.data, safe=False)

And here is serializers.py:

class IgricaSerializer(serializers.ModelSerializer):
    class Meta:
        model = Igrica
        fields = (
            'id',
            'sifra_artikla',
            'naziv',
            'cena',
            'konzola',
            'slika',
            'opis',
            'rejting',
            'vrsta',
            'detalji_igrica',
            'komentari'
    )

As you can see it has one embedded and one array field imported from djongo models. Now when I want to search for all games for example that have in detalji_igrica a field pegi_rejting = 18, this is the message I get:

FieldError at /api/igrice/najjeftinije Unsupported lookup 'pegi_rejting' for EmbeddedField or join on the field not permitted.

Similar message for Array field:

FieldError at /api/igrice/najjeftinije Unsupported lookup 'id_korisnika' for ArrayField or join on the field not permitted.

I would really appreciate the help!

1

There are 1 answers

0
Андрей Городний On

I can't answer directly for your question, because I can't find any answers about issues from my personal project. Anyway, You need to use right Python naming style for Classes.

Your model field name is similar with you model container name.

Change class komentari(models.Model) to class Komentari(models.Model), and

komentari = models.ArrayField(
    model_container = komentari
)

to

komentari = models.ArrayField(
    model_container = Komentari
)