Я ранее установил поле идентификатора в своей модели Мира, что-то сбивало с толку, поскольку я удалил его, я добавил строку:
id = models.AutoField(primary_key=True)
Когда я запускал makemitigrations снова он спросил меня, переименовал ли я поле идентификатора в это новое, и я нажал «да», и это разобралось.
Моя модель сейчас:
class World(models.Model):
id = models.AutoField(primary_key=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default='')
name = models.CharField(max_length=200)
setting = models.CharField(max_length=200)
creation_date = models.DateTimeField('date created')
Лучший способ сделать вещи как это (по моему скромному мнению), состоит в том, чтобы создать менеджера по пространству имен. Это может использоваться, называя SelectNodes для указания, какие URL пространства имен подключены с который префиксы. Я обычно настроил статическое свойство, которое возвращает соответствующий экземпляр как это (это - C#, необходимо будет перевести):
private static XmlNamespaceManager _nsMgr;
public static XmlNamespaceManager NsMgr
{
get
{
if (_nsMgr == null)
{
_nsMgr = new XmlNamespaceManager(new NameTable());
_nsMgr.AddNamespace("msb", "http://schemas.microsoft.com/developer/msbuild/2003");
}
return _nsMgr;
}
}
я включаю только одно пространство имен здесь, но у Вас могли быть несколько. Затем можно выбрать из документа как это:
Dim value As Object = xmlDoc.SelectNodes("/msb:Project/msb:PropertyGroup/msb:ProjectGuid", NsMgr)
Примечание, что все элементы находятся в указанном пространстве имен.
Я, вероятно, был бы склонен пойти с <забастовкой> Bartek забастовка> * решение для пространства имен, но общее xpath решение:
//*[local-name()='ProjectGuid']
**, так как ответ Bartek исчез, я рекомендую Teun (который на самом деле более полон), *
Эта проблема уже была здесь несколько времена .
Любой Вы работаете с агностическими пространством имен выражениями XPath (не рекомендуемый для его неуклюжести и потенциала для ложных положительных совпадений - <msb:ProjectGuid>
, и <foo:ProjectGuid>
то же для этого выражения):
//*[local-name() = 'ProjectGuid']
или Вы делаете правильную вещь и используете XmlNamespaceManager
для регистрации пространства имен URI, таким образом, можно включать префикс пространства имен в XPath:
Dim xmlDoc As New XmlDocument()
xmlDoc.Load(Path.Combine(mDirectory, name, name + ".vbproj"))
Dim nsmgr As New XmlNamespaceManager(xmlDoc.NameTable)
nsmgr.AddNamespace("msb", "http://schemas.microsoft.com/developer/msbuild/2003")
Dim xpath As String = "/msb:Project/msb:PropertyGroup/msb:ProjectGuid"
Dim value As Object = xmlDoc.SelectNodes(xpath, nsmgr)
Необходимо только зарегистрировать это пространства имен XML и партнер префикса, чтобы заставить запрос работать. Создайте и передайте менеджера по пространству имен как второй параметр при выборе узлов:
Dim ns As New XmlNamespaceManager ( xmlDoc.NameTable )
ns.AddNamespace ( "msbuild", "http://schemas.microsoft.com/developer/msbuild/2003" )
Dim value As Object = xmlDoc.SelectNodes("/msbuild:Project/msbuild:PropertyGroup/msbuild:ProjectGuid", ns)
Почему бы не использовать//для игнорирования пространства имен:
Dim value As Object = xmlDoc.SelectNodes("//ProjectGuid")
//действует как подстановочный знак для выполнения всего между корнем и следующим указанным именем узла (т.е. ProjectGuid)