Hmmm, now the question is, is that intended for databases that can handle
a temporary null in a foreign key?  What DB are you using?  I see that
Postgres gives me no grief about null=True, since it sets up as

CREATE TABLE licensing_server
(
  id int4 NOT NULL DEFAULT nextval('licensing_server_id_seq'::regclass),
  name varchar(200) NOT NULL,
  revised_date timestamptz NOT NULL,
  current_ip inet NOT NULL,
  mac_address varchar(22) NOT NULL,
  current_hostname varchar(100) NOT NULL,
  platform varchar(60) NOT NULL,
  tier int4 NOT NULL,
  area_of_application varchar(60) NOT NULL,
  role varchar(11) NOT NULL,
  status varchar(11) NOT NULL,
  server_twin_id int4 NOT NULL,
  server_sibling_id int4 NOT NULL,
  primary_fte_id int4 NOT NULL,
  CONSTRAINT licensing_server_pkey PRIMARY KEY (id),
  CONSTRAINT licensing_server_primary_fte_id_fkey FOREIGN KEY
(primary_fte_id) REFERENCES licensing_fte (id) ON UPDATE NO ACTION ON
DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED,
  CONSTRAINT server_sibling_id_refs_id_13bbfcb7 FOREIGN KEY
(server_sibling_id) REFERENCES licensing_server (id) ON UPDATE NO ACTION
ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED,
  CONSTRAINT server_twin_id_refs_id_13bbfcb7 FOREIGN KEY (server_twin_id)
REFERENCES licensing_server (id) ON UPDATE NO ACTION ON DELETE NO ACTION
DEFERRABLE INITIALLY DEFERRED
)

That one is complex--but look at the last 3 constraints.  The Foreign Key
in the first constraint points to another table (licensing_fte) where an
id is expected.  The last two constraints are Foreign Keys that point back
into the same table (adjacency list).  I did NOT set null=True, but I can
load data until I change the CONSTRAINT ACTION.  When I change the
constraint actions, I will get bitten by the DB as soon as I have a FK
that doesn't tie out.

>
>> No, it is not the case that null=True is disallowed for FKs, but it
>> probably should be.
>
> I've just been reading the code in django.db.models.fields.related,
> and there's a pretty clear indication that the Django developers
> explicitly wanted ForeignKeys to be nullable.  In the RelatedManager
> class, which is dynamically created by the
> ForeignRelatedObjectsDescriptor class, the following appears:
>
>     class RelatedManager(superclass):
>             # ...
>             # remove() and clear() are only provided if the ForeignKey
> can have a value of null.
>             if rel_field.null:
>                 def remove(self, *objs):
>                     val = getattr(instance,
> rel_field.rel.get_related_field().attname)
>                     for obj in objs:
>                         # Is obj actually part of this descriptor set?
>                         if getattr(obj, rel_field.attname) == val:
>                             setattr(obj, rel_field.name, None)
>                             obj.save()
>                         else:
>                             raise rel_field.rel.to.DoesNotExist, "%r
> is not related to %r." % (obj, instance)
>                 remove.alters_data = True
>
>                 def clear(self):
>                     for obj in self.all():
>                         setattr(obj, rel_field.name, None)
>                         obj.save()
>                 clear.alters_data = True
>             #...
>
> It looks to me like allowing null=True on ForeignKeys is therefore not
> merely an oversight, which presumably means it gets sorted out
> correctly at the backend.  I think for now I may stick with null=True
> and ask on django-developers.
>
> Any thoughts?
>
> Richard
>
> >
>


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to