Question

class dbview(models.Model):
    # field definitions omitted for brevity
    class Meta:
        db_table = 'read_only_view'

def main(request):
    result = dbview.objects.all()

A capturé une exception lors du rendu: (1054, "Colonne inconnue 'lecture seule". id ' dans 'liste de champs' ")

Il n'y a pas de clé primaire à voir dans la vue. Y a-t-il une solution de contournement?

Commentaire:
Je n'ai aucun contrôle sur la vue à laquelle j'accède avec Django. Le navigateur MySQL affiche les colonnes mais pas la clé primaire.

Était-ce utile?

La solution

Lorsque vous dites "Je n'ai aucun contrôle sur la vue à laquelle j'accède avec Django. Le navigateur MySQL affiche les colonnes mais pas la clé primaire. '

Je suppose que vous voulez dire qu'il s'agit d'une table héritée et que vous n'êtes pas autorisé à ajouter ou à modifier des colonnes?

Si tel est le cas et qu'il n'y a pas vraiment de clé primaire (même une chaîne ou une colonne non-int *), la table n'a pas été configurée correctement et les performances risquent de ne pas être nauséabondes.

Cela n’a aucune importance pour vous. Tout ce dont vous avez besoin est une colonne qui est garantie d'être unique pour chaque ligne. Définissez-le sur 'primary_key = True dans votre modèle et Django sera heureux.

  • Il existe une autre possibilité qui serait problématique. Si aucune colonne n'est unique, il est possible que la table utilise des clés primaires composites. C’est-à-dire qu’il est spécifié que deux colonnes ensemble fourniront une clé primaire unique. Ceci est une modélisation relationnelle parfaitement valide mais malheureusement non prise en charge par Django. Dans ce cas, vous ne pouvez pas faire grand chose en plus du SQL brut à moins d’obtenir une autre colonne.

Autres conseils

J'ai ce problème tout le temps. J'ai une vue que je ne peux pas ou ne veux pas changer, mais je veux une page pour afficher des informations composites (peut-être dans la section admin). Je viens de remplacer la sauvegarde et déclenche une NotImplementedError:

    def save(self, **kwargs):
        raise NotImplementedError()

(bien que ce ne soit probablement pas nécessaire dans la plupart des cas, mais cela me fait me sentir un peu mieux)

J'ai également défini False dans la classe Meta.

    class Meta:
       managed = False

Ensuite, je choisis n'importe quel champ et le marque comme clé primaire. Peu importe que ce soit vraiment unique, vous ne faites que des filtres pour afficher des informations sur une page, etc.

semble fonctionner correctement pour moi. Merci de bien vouloir noter s’il ya des problèmes avec cette technique.

S'il y a vraiment pas de clé primaire dans la vue, il n'y a pas de solution de contournement.

Django exige que chaque modèle ait exactement un champ primary_key = True .

Il aurait dû y avoir un champ id généré automatiquement lorsque vous avez exécuté syncdb (s'il n'y a pas de clé primaire définie dans votre modèle, Django insérera un AutoField pour vous).

Cette erreur signifie que Django demande à votre base de données le champ id , mais qu’il n’en existe aucun. Pouvez-vous exécuter django manage.py dbshell puis DESCRIBE read_only_view; et publier le résultat? Cela affichera toutes les colonnes de la base de données.

Sinon, pouvez-vous inclure la définition de modèle que vous avez exclue? (et confirmez que vous n'avez pas modifié la définition du modèle depuis l'exécution de syncdb ?)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top