django-dataTables невозможно искать по иностранным ссылкам / многим многим ссылкам - PullRequest
0 голосов
/ 15 января 2019

Я использую инфраструктуру отдыха dataTables для django, и когда я пытаюсь найти данные с нуля, используя маршрут и этот маршрут, используя многие ссылки ToMany или внешний ключ, это вызывает проблему с иконками

http://127.0.0.1:8000/test/api/tout-les-ig/?format=datatables&draw=4&columns[0][data]=number&columns[0][name]=&columns[0][searchable]=true&columns[0][orderable]=true&columns[0][search][value]=test&columns[0][search][regex]=false&order[0][column]=0&order[0][dir]=asc&start=0&length=90&search[value]=&search[regex]=false&_=1547546595865

Допустим, [данные] = число является внешним ключом и [поиск] [значение] = тест так что если я не поставлю [search] [value] = значение в этом, я не приму ошибку но если я это сделаю, то скажу: «Связанное поле получило недопустимый поиск: icontains»

Я уже пытался делать все подобные вещи в сериализаторе: number = serializers.SerializerMethodField () def get_style (self, IG): вернуть ',' .join ([str (, b.get_number ()) для nb в SOME.number.all ()])

JS FILE:

      var table = $('#liste').DataTable(
      {
          "language": {
                        "emptyTable":           "Aucune donnée trouvée dans la base",
                        "sSearch":              "recherche: ",
                        "searchPlaceholder":    "recherche dans IGIPOP",
                        "lengthMenu":           "Affichage de _MENU_ éléments par page",
                        "infoEmpty":            "Aucun éléments ne correponds à la recherche",
                        "info":                 "résultats de _START_ à _END_ pour un total de _TOTAL_",
                        "infoFiltered":         "(filtré avec _MAX_ éléments trouvés)",
                        "zeroRecords":          "Aucun résultat",
                        "processing":           "Recherche en cours...",
                        "paginate": {
                                        "previous": "Page précédente",
                                        "next":     "Page suivante"
                                    }
                      },


          'serverSide': true, // permet les requêtes ajax
          'ajax': '{{api_route}}', // route du json attendu
              dataFilter: function(data){
                var json = jQuery.parseJSON(data);
                json.recordsTotal = json.count;
                json.recordsFiltered = json.count;
                json.data = json.results;
                delete json.results;
                return JSON.stringify(json); // return JSON string
            },
          'columns': [ 

            {% for data in datas %}
                {% if data == 'numero' %}
                {
                    'data':'{{data}}',
                    "fnCreatedCell": function(nTd, sData, oData, iRow, iCol)
                        {
                            $(nTd).html("<a href=" + "\"" + oData.og + "/\"" + "><span class='btn btn-success'>" + oData.numero + "</span></a>");
                        },
                },
                {% else %}
                    {'data':'{{data}}'},
                {% endif %}
            {% endfor %}
          ],

          "fnRowCallback": function (nRow, aData, iDisplayIndex, iDisplayIndexFull)
          {
            $(nRow).css('background-color', aData.style['background-color']);
            $(nRow).css('color', aData.style['color']);

            return nRow;
          },
          deferRender:    true,
          scrollY:        '50vh',
          scrollCollapse: true,
          scroller:       true,
          stateSave:      true,
          "processing":   true,
    }
    );

сериализаторы: Класс IGSerializer (serializers.ModelSerializer):

id = serializers.IntegerField(read_only=True)  
# ---- #
DT_RowId = serializers.SerializerMethodField()  # permet l'affichage des clés étrangères
def get_DT_RowId(self, IG):
    return 'row_%d' % IG.pk

# ---- #
DT_RowAttr = serializers.SerializerMethodField()# en iterant depuis la même colonne sur chacun de ses elements
def get_DT_RowAttr(self, IG):
    return {'data-pk': IG.pk}

class Meta:
    model = IG # TODO: changement par les études réseaux et tout les appels à un IG dans la définition des méthodes plus haut
    fields = ( # champ apparaissant dans le rendu final JSON
        'number'
    )
    datatables_always_serialize = ('id', 'number')
...