Je suis nouveau dans l'ORM de Django et je suis confus par les conventions de jointure interne malgré avoir consulté la documentation et d' autres réponses sur SO. J'ai deux tables - MyPoints
et MyBuffers
qui sont liées par projectid
(aucun doublon dans l'une ou l'autre table). Mon objectif est de récupérer le radius
champ en utilisant la jointure interne sur projectid
. Même si j'ai défini une clé étrangère, ma première tentative d'extraction de tous les champs de MyBuffers
ne renvoie rien de la table jointe, et ma deuxième tentative d'extraction d'un champ à partir d' MyBuffers
erreurs. Quel est le problème avec la syntaxe ou la méthodologie ici ? Les colonnes clés doivent-elles être nommées différemment ? Tout avis serait grandement apprécié!
modèles.py
from django.contrib.gis.db import models
class MyBuffers(models.Model):
id = models.BigAutoField(primary_key=True)
projectid = models.CharField(max_length=25, unique=True)
radius = models.IntegerField(blank=True, null=True)
class Meta:
managed = False
db_table = 'my_buffers'
class MyPoints(models.Model):
id = models.BigAutoField(primary_key=True)
projectid = models.ForeignKey('MyBuffers', max_length=25, on_delete=models.DO_NOTHING, to_field='projectid', db_column='projectid')
geog = models.PointField(geography=True, srid=4326)
class Meta:
managed = False
db_table = 'my_points'
vues.py
from .models import MyPoints
from .models import MyBuffers
1.Ne renvoie aucun champ de la MyBuffers
table jointe
test = MyPoints.objects.select_related('projectid')
test.first().__dict__
{'_state': <django.db.models.base.ModelState object at 0x7f3e21786520>, 'id': 5808, 'projectid_id': 'foobar1', 'geog': <Point object at 0x7f3e21738910>}
2.Lance une erreur
test= MyPoints.objects.select_related('projectid__radius')
test.first().__dict__
django.core.exceptions.FieldError: Non-relational field given in select_related: 'radius'. Choices are: (none)
Je pense que select related ne fonctionne que dans les clés étrangères. Donc, si vous essayez d'obtenir des champs autres que des clés étrangères, une erreur s'affichera. Votre ensemble de requêtes doit être
test= MyPoints.objects.select_related('projectid')
# To get radius
test.first().projectid.radius
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots