Python django.db.models.fields.related.ForeignKey() Examples
The following are 20
code examples of django.db.models.fields.related.ForeignKey().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
django.db.models.fields.related
, or try the search function
.
Example #1
Source File: endpoints.py From drf-schema-adapter with MIT License | 6 votes |
def get_needs(self): model_fields = [ f for f in self.model._meta.get_fields() if f.is_relation and f.name in self.get_fields_for_serializer() and ( not isinstance(f, ForeignKey) or self.foreign_key_as_list is False or ( isinstance(self.foreign_key_as_list, Iterable) and f.name not in self.foreign_key_as_list ) ) ] related_models = [ f.related_model if f.related_model and f.related_model != self.model else f.model if f.model and f.model != self.model else None for f in model_fields ] return [ { 'app': model._meta.app_label, 'singular': model._meta.model_name.lower(), 'plural': self.inflector.pluralize(model._meta.model_name.lower()), } for model in related_models if model is not None ]
Example #2
Source File: simpletags.py From simpleui with MIT License | 6 votes |
def search_placeholder(context): cl = context.get('cl') # 取消递归,只获取2级 fields = get_model_fields(cl.model) for f in cl.model._meta.fields: if isinstance(f, ForeignKey): fields.extend(get_model_fields(f.related_model, f.name)) verboses = [] for s in cl.search_fields: for f in fields: if f[0] == s: verboses.append(f[1]) break return ",".join(verboses)
Example #3
Source File: context.py From django-stubs with MIT License | 6 votes |
def get_field_set_type(self, api: TypeChecker, field: Union[Field, ForeignObjectRel], *, method: str) -> MypyType: """ Get a type of __set__ for this specific Django field. """ target_field = field if isinstance(field, ForeignKey): target_field = field.target_field field_info = helpers.lookup_class_typeinfo(api, target_field.__class__) if field_info is None: return AnyType(TypeOfAny.from_error) field_set_type = helpers.get_private_descriptor_type(field_info, '_pyi_private_set_type', is_nullable=self.get_field_nullability(field, method)) if isinstance(target_field, ArrayField): argument_field_type = self.get_field_set_type(api, target_field.base_field, method=method) field_set_type = helpers.convert_any_to_type(field_set_type, argument_field_type) return field_set_type
Example #4
Source File: simpletags.py From ishare with MIT License | 6 votes |
def search_placeholder(context): cl = context.get('cl') # 取消递归,只获取2级 fields = get_model_fields(cl.model) for f in cl.model._meta.fields: if isinstance(f, ForeignKey): fields.extend(get_model_fields(f.related_model, f.name)) verboses = [] for s in cl.search_fields: for f in fields: if f[0] == s: verboses.append(f[1]) break return ",".join(verboses)
Example #5
Source File: utils.py From django-project with BSD 3-Clause "New" or "Revised" License | 6 votes |
def register(model, field_name=None, related_name=None, lookup_method_name='get_follows'): """ This registers any model class to be follow-able. """ if model in registry: return registry.append(model) if not field_name: field_name = 'target_%s' % model._meta.model_name if not related_name: related_name = 'follow_%s' % model._meta.model_name field = ForeignKey(model, related_name=related_name, null=True, blank=True, db_index=True) field.contribute_to_class(Follow, field_name) setattr(model, lookup_method_name, get_followers_for_object) model_map[model] = [related_name, field_name]
Example #6
Source File: models.py From cleanerversion with Apache License 2.0 | 6 votes |
def detach(self): """ Detaches the instance from its history. Similar to creating a new object with the same field values. The id and identity fields are set to a new value. The returned object has not been saved, call save() afterwards when you are ready to persist the object. ManyToMany and reverse ForeignKey relations are lost for the detached object. :return: Versionable """ self.id = self.identity = self.uuid() self.version_start_date = self.version_birth_date = get_utc_now() self.version_end_date = None return self
Example #7
Source File: bigquery.py From openprescribing with MIT License | 6 votes |
def build_schema_from_model(model): field_mappings = { model_fields.BigIntegerField: "INTEGER", model_fields.CharField: "STRING", model_fields.DateField: "DATE", model_fields.FloatField: "FLOAT", model_fields.DecimalField: "NUMERIC", model_fields.IntegerField: "INTEGER", model_fields.BooleanField: "BOOLEAN", model_fields.NullBooleanField: "BOOLEAN", model_fields.TextField: "STRING", related_fields.ForeignKey: "INTEGER", related_fields.OneToOneField: "INTEGER", } fields = [ (f.name, field_mappings[type(f)]) for f in model._meta.fields if not f.auto_created ] return build_schema(*fields)
Example #8
Source File: tests.py From djongo with GNU Affero General Public License v3.0 | 5 votes |
def test_no_index_for_foreignkey(self): """ MySQL on InnoDB already creates indexes automatically for foreign keys. (#14180). An index should be created if db_constraint=False (#26171). """ storage = connection.introspection.get_storage_engine( connection.cursor(), ArticleTranslation._meta.db_table ) if storage != "InnoDB": self.skip("This test only applies to the InnoDB storage engine") index_sql = [str(statement) for statement in connection.schema_editor()._model_indexes_sql(ArticleTranslation)] self.assertEqual(index_sql, [ 'CREATE INDEX `indexes_articletranslation_article_no_constraint_id_d6c0806b` ' 'ON `indexes_articletranslation` (`article_no_constraint_id`)' ]) # The index also shouldn't be created if the ForeignKey is added after # the model was created. field_created = False try: with connection.schema_editor() as editor: new_field = ForeignKey(Article, CASCADE) new_field.set_attributes_from_name('new_foreign_key') editor.add_field(ArticleTranslation, new_field) field_created = True self.assertEqual([str(statement) for statement in editor.deferred_sql], [ 'ALTER TABLE `indexes_articletranslation` ' 'ADD CONSTRAINT `indexes_articletrans_new_foreign_key_id_d27a9146_fk_indexes_a` ' 'FOREIGN KEY (`new_foreign_key_id`) REFERENCES `indexes_article` (`id`)' ]) finally: if field_created: with connection.schema_editor() as editor: editor.remove_field(ArticleTranslation, new_field)
Example #9
Source File: context.py From django-stubs with MIT License | 5 votes |
def get_field_nullability(self, field: Union[Field, ForeignObjectRel], method: Optional[str]) -> bool: nullable = field.null if not nullable and isinstance(field, CharField) and field.blank: return True if method == '__init__': if ((isinstance(field, Field) and field.primary_key) or isinstance(field, ForeignKey)): return True if method == 'create': if isinstance(field, AutoField): return True if isinstance(field, Field) and field.has_default(): return True return nullable
Example #10
Source File: models.py From django-stubs with MIT License | 5 votes |
def run_with_model_cls(self, model_cls: Type[Model]) -> None: for field in model_cls._meta.get_fields(): if isinstance(field, ForeignKey): related_model_cls = self.django_context.get_field_related_model_cls(field) if related_model_cls is None: error_context: Context = self.ctx.cls field_sym = self.ctx.cls.info.get(field.name) if field_sym is not None and field_sym.node is not None: error_context = field_sym.node self.api.fail(f'Cannot find model {field.related_model!r} ' f'referenced in field {field.name!r} ', ctx=error_context) self.add_new_node_to_model_class(field.attname, AnyType(TypeOfAny.explicit)) continue if related_model_cls._meta.abstract: continue rel_primary_key_field = self.django_context.get_primary_key_field(related_model_cls) try: field_info = self.lookup_class_typeinfo_or_incomplete_defn_error(rel_primary_key_field.__class__) except helpers.IncompleteDefnException as exc: if not self.api.final_iteration: raise exc else: continue is_nullable = self.django_context.get_field_nullability(field, None) set_type, get_type = get_field_descriptor_types(field_info, is_nullable) self.add_new_node_to_model_class(field.attname, Instance(field_info, [set_type, get_type]))
Example #11
Source File: generate_dmd_fixture.py From openprescribing with MIT License | 5 votes |
def handle(self, *args, **kwargs): classes_we_care_about = (VMP, VMPP, AMP, AMPP, GTIN) ids = kwargs["ids"] objs = [] for cls in classes_we_care_about: objs.extend(cls.objects.filter(id__in=ids)) for obj in objs: for f in obj._meta.get_fields(): if isinstance(f, ForeignKey): related_obj = getattr(obj, f.name) if related_obj is not None and related_obj not in objs: objs.append(related_obj) if ( kwargs["include_reverse_relations"] and isinstance(obj, classes_we_care_about) and isinstance(f, ManyToOneRel) and f.related_model in classes_we_care_about ): if isinstance(f, OneToOneRel): try: objs.append(getattr(obj, f.get_accessor_name())) except ObjectDoesNotExist: pass else: related_objs = getattr(obj, f.get_accessor_name()).all() for related_obj in related_objs: if related_obj not in objs: objs.append(related_obj) print(serializers.serialize("json", objs, indent=2))
Example #12
Source File: tests.py From djongo with GNU Affero General Public License v3.0 | 5 votes |
def test_no_index_for_foreignkey(self): """ MySQL on InnoDB already creates indexes automatically for foreign keys. (#14180). An index should be created if db_constraint=False (#26171). """ storage = connection.introspection.get_storage_engine( connection.cursor(), ArticleTranslation._meta.db_table ) if storage != "InnoDB": self.skip("This test only applies to the InnoDB storage engine") index_sql = [str(statement) for statement in connection.schema_editor()._model_indexes_sql(ArticleTranslation)] self.assertEqual(index_sql, [ 'CREATE INDEX `indexes_articletranslation_article_no_constraint_id_d6c0806b` ' 'ON `indexes_articletranslation` (`article_no_constraint_id`)' ]) # The index also shouldn't be created if the ForeignKey is added after # the model was created. field_created = False try: with connection.schema_editor() as editor: new_field = ForeignKey(Article, CASCADE) new_field.set_attributes_from_name('new_foreign_key') editor.add_field(ArticleTranslation, new_field) field_created = True self.assertEqual([str(statement) for statement in editor.deferred_sql], [ 'ALTER TABLE `indexes_articletranslation` ' 'ADD CONSTRAINT `indexes_articletrans_new_foreign_key_id_d27a9146_fk_indexes_a` ' 'FOREIGN KEY (`new_foreign_key_id`) REFERENCES `indexes_article` (`id`)' ]) finally: if field_created: with connection.schema_editor() as editor: editor.remove_field(ArticleTranslation, new_field)
Example #13
Source File: serializer.py From Kiwi with GNU General Public License v2.0 | 5 votes |
def serialize_model(self): """ Check the fields of models and convert the data Returns: Dictionary """ if not hasattr(self.model, '__dict__'): raise TypeError("Models or Dictionary is required") response = {} opts = self.model._meta for field in opts.local_fields: # for a django model, retrieving a foreignkey field # will fail when the field value isn't set try: value = getattr(self.model, field.name) except ObjectDoesNotExist: value = None if isinstance(value, datetime): value = datetime_to_str(value) if isinstance(value, timedelta): value = timedelta_to_str(value) if isinstance(field, ForeignKey): fk_id = "%s_id" % field.name if value is None: response[fk_id] = None else: response[fk_id] = getattr(self.model, fk_id) value = str(value) response[field.name] = value for field in opts.local_many_to_many: value = getattr(self.model, field.name) value = value.values_list('pk', flat=True) response[field.name] = list(value) return response
Example #14
Source File: tests.py From django-sqlserver with MIT License | 5 votes |
def test_no_index_for_foreignkey(self): """ MySQL on InnoDB already creates indexes automatically for foreign keys. (#14180). An index should be created if db_constraint=False (#26171). """ storage = connection.introspection.get_storage_engine( connection.cursor(), ArticleTranslation._meta.db_table ) if storage != "InnoDB": self.skip("This test only applies to the InnoDB storage engine") index_sql = connection.schema_editor()._model_indexes_sql(ArticleTranslation) self.assertEqual(index_sql, [ 'CREATE INDEX `indexes_articletranslation_article_no_constraint_id_d6c0806b` ' 'ON `indexes_articletranslation` (`article_no_constraint_id`)' ]) # The index also shouldn't be created if the ForeignKey is added after # the model was created. field_created = False try: with connection.schema_editor() as editor: new_field = ForeignKey(Article, CASCADE) new_field.set_attributes_from_name('new_foreign_key') editor.add_field(ArticleTranslation, new_field) field_created = True self.assertEqual(editor.deferred_sql, [ 'ALTER TABLE `indexes_articletranslation` ' 'ADD CONSTRAINT `indexes_articletrans_new_foreign_key_id_d27a9146_fk_indexes_a` ' 'FOREIGN KEY (`new_foreign_key_id`) REFERENCES `indexes_article` (`id`)' ]) finally: if field_created: with connection.schema_editor() as editor: editor.remove_field(ArticleTranslation, new_field)
Example #15
Source File: mail.py From django-db-mailer with GNU General Public License v2.0 | 5 votes |
def _model_to_dict(instance): opts, data = getattr(instance, '_meta'), dict() for f in opts.fields + opts.many_to_many: if isinstance(f, ManyToManyField): if instance.pk is None: data[f.name] = [] else: data[f.name] = [ item.pk for item in f.value_from_object(instance)] elif isinstance(f, ForeignKey): if getattr(instance, f.name): data[f.name] = getattr(instance, f.name).__str__() else: data[f.name] = f.value_from_object(instance) return data
Example #16
Source File: fields.py From django-modelcluster with BSD 3-Clause "New" or "Revised" License | 5 votes |
def check(self, **kwargs): from modelcluster.models import ClusterableModel errors = super(ParentalKey, self).check(**kwargs) # Check that the destination model is a subclass of ClusterableModel. # If self.rel.to is a string at this point, it means that Django has been unable # to resolve it as a model name; if so, skip this test so that Django's own # system checks can report the appropriate error if isinstance(self.remote_field.model, type) and not issubclass(self.remote_field.model, ClusterableModel): errors.append( checks.Error( 'ParentalKey must point to a subclass of ClusterableModel.', hint='Change {model_name} into a ClusterableModel or use a ForeignKey instead.'.format( model_name=self.remote_field.model._meta.app_label + '.' + self.remote_field.model.__name__, ), obj=self, id='modelcluster.E001', ) ) # ParentalKeys must have an accessor name (#49) if self.remote_field.get_accessor_name() == '+': errors.append( checks.Error( "related_name='+' is not allowed on ParentalKey fields", hint="Either change it to a valid name or remove it", obj=self, id='modelcluster.E002', ) ) return errors
Example #17
Source File: models.py From peering-manager with Apache License 2.0 | 5 votes |
def to_dict(self): data = {} # Iterate over croncrete and many-to-many fields for field in self._meta.concrete_fields + self._meta.many_to_many: value = None # If the value of the field is another model, fetch an instance of it # Exception made of tags for which we just retrieve the list of them for later # conversion to simple strings if isinstance(field, ForeignKey): value = self.__getattribute__(field.name) elif isinstance(field, ManyToManyField): value = list(self.__getattribute__(field.name).all()) elif isinstance(field, TaggableManager): value = list(self.__getattribute__(field.name).all()) else: value = self.__getattribute__(field.name) # If the instance of a model as a to_dict() function, call it if isinstance(value, TemplateModel): data[field.name] = value.to_dict() elif isinstance(value, list): data[field.name] = [] for element in value: if isinstance(element, TemplateModel): data[field.name].append(element.to_dict()) else: data[field.name].append(str(element)) else: data[field.name] = value return data
Example #18
Source File: betterJSONSerializer.py From arches with GNU Affero General Public License v3.0 | 4 votes |
def handle_model(self, instance, fields=None, exclude=None): """ Returns a dict containing the data in ``instance`` suitable for passing as a Form's ``initial`` keyword argument. ``fields`` is an optional list of field names. If provided, only the named fields will be included in the returned dict. ``exclude`` is an optional list of field names. If provided, the named fields will be excluded from the returned dict, even if they are listed in the ``fields`` argument. """ # avoid a circular import from django.db.models.fields.related import ManyToManyField, ForeignKey opts = instance._meta data = {} # print '='*40 properties = [k for k, v in instance.__class__.__dict__.items() if type(v) is property] for property_name in properties: if fields and property_name not in fields: continue if exclude and property_name in exclude: continue data[property_name] = self.handle_object(getattr(instance, property_name)) for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many): if not getattr(f, "editable", False): continue if fields and f.name not in fields: continue if exclude and f.name in exclude: continue if isinstance(f, ForeignKey): # Emulate the naming convention used by django when accessing the # related model's id field # see https://github.com/django/django/blob/master/django/db/models/fields/__init__.py val = getattr(instance, f.attname, None) data[f.attname] = val elif isinstance(f, ManyToManyField): # If the object doesn't have a primary key yet, just use an empty # list for its m2m fields. Calling f.value_from_object will raise # an exception. if instance.pk is None: data[f.name] = [] else: # MultipleChoiceWidget needs a list of pks, not object instances. qs = f.value_from_object(instance) data[f.name] = [item.pk for item in qs] else: data[f.name] = self.handle_object(f.value_from_object(instance)) return data
Example #19
Source File: context.py From django-stubs with MIT License | 4 votes |
def get_expected_types(self, api: TypeChecker, model_cls: Type[Model], *, method: str) -> Dict[str, MypyType]: from django.contrib.contenttypes.fields import GenericForeignKey expected_types = {} # add pk if not abstract=True if not model_cls._meta.abstract: primary_key_field = self.get_primary_key_field(model_cls) field_set_type = self.get_field_set_type(api, primary_key_field, method=method) expected_types['pk'] = field_set_type for field in model_cls._meta.get_fields(): if isinstance(field, Field): field_name = field.attname field_set_type = self.get_field_set_type(api, field, method=method) expected_types[field_name] = field_set_type if isinstance(field, ForeignKey): field_name = field.name foreign_key_info = helpers.lookup_class_typeinfo(api, field.__class__) if foreign_key_info is None: # maybe there's no type annotation for the field expected_types[field_name] = AnyType(TypeOfAny.unannotated) continue related_model = self.get_field_related_model_cls(field) if related_model is None: expected_types[field_name] = AnyType(TypeOfAny.from_error) continue if related_model._meta.proxy_for_model is not None: related_model = related_model._meta.proxy_for_model related_model_info = helpers.lookup_class_typeinfo(api, related_model) if related_model_info is None: expected_types[field_name] = AnyType(TypeOfAny.unannotated) continue is_nullable = self.get_field_nullability(field, method) foreign_key_set_type = helpers.get_private_descriptor_type(foreign_key_info, '_pyi_private_set_type', is_nullable=is_nullable) model_set_type = helpers.convert_any_to_type(foreign_key_set_type, Instance(related_model_info, [])) expected_types[field_name] = model_set_type elif isinstance(field, GenericForeignKey): # it's generic, so cannot set specific model field_name = field.name gfk_info = helpers.lookup_class_typeinfo(api, field.__class__) gfk_set_type = helpers.get_private_descriptor_type(gfk_info, '_pyi_private_set_type', is_nullable=True) expected_types[field_name] = gfk_set_type return expected_types
Example #20
Source File: generate_template_doc.py From peering-manager with Apache License 2.0 | 4 votes |
def get_model_variables(model): variables = [] for field in model._meta.concrete_fields + model._meta.many_to_many: variable = None if isinstance(field, ForeignKey): variable = "`{}`: {} object".format( field.name, get_model_file_link(field.related_model) ) elif isinstance(field, ManyToManyField): variable = "`{}`: list of {} objects".format( field.name, get_model_file_link(field.related_model) ) elif isinstance(field, TaggableManager): variable = "`{}`: list of tags".format(field.name) else: field_type = None if isinstance(field, BooleanField): field_type = "boolean" elif isinstance(field, CharField): field_type = "string" elif isinstance(field, TextField): field_type = "text" elif isinstance(field, DateTimeField): field_type = "date" elif isinstance(field, InetAddressField): field_type = "IP address" elif ( isinstance(field, AutoField) or isinstance(field, BigIntegerField) or isinstance(field, PositiveIntegerField) or isinstance(field, PositiveSmallIntegerField) ): field_type = "integer".format(field.name) else: print( "Unknown type for `{}`: {}".format( field.name, field.get_internal_type() ) ) if field_type: variable = "`{}`: {} value".format(field.name, field_type) if variable: variables.append(variable) return variables